2008-09-16 4 views

답변

4
e => e.MoveNext() ? e.Current : null 

는이 열거의 발전과 현재 값을 반환하고, 열거가 완료되면 널 (null)을 반환합니다.

1

람다 표현식은 복잡한 문장을 포함 할 수 있습니다, 그래서 당신은 다음과 같은 작업을 수행 할 수

Func<IEnumerator, object> f = ie => { ie.MoveNext(); return ie.Current; }; 
0

여기를 클릭하십시오.

List<string> strings = new List<string>() 
{ 
    "Hello", "I", "am", "a", "list", "of", "strings." 
}; 
IEnumerator<string> e = strings.GetEnumerator(); 
Func<string> f =() => e.MoveNext() ? e.Current : null; 
for (; ;) 
{ 
    string str = f(); 
    if (str == null) 
     break; 

    Console.Write(str + " "); 
} 

IEnumerator의 요점은 당신이 이미 그것을 다루는 문법 설탕을 얻을 수 있습니다 :

foreach (string str in strings) 
    Console.Write(str + " "); 

심지어 열거 직접이 경우 청소기 보이는 처리 :

while (e.MoveNext()) 
    Console.Write(e.Current + " "); 
0

확장 Abe의 솔루션에서 클로저를 사용하여 열거 자에 대한 참조를 보유 할 수도 있습니다.

var iter = ((IEnumerable<char>)"hello").GetEnumerator(); 

//with closure 
{ 
    Func<object> f = 
     () => 
      { 
       iter.MoveNext(); 
       return iter.Current; 
      }; 
    Console.WriteLine(f()); 
    Console.WriteLine(f()); 
} 

//without closure 
{ 
    Func<IEnumerator, object> f = 
     ie => 
      { 
       ie.MoveNext(); 
       return ie.Current; 
      }; 
    Console.WriteLine(f(iter)); 
    Console.WriteLine(f(iter)); 
} 
관련 문제