IEnumerator 변수를 사용하면 람다 함수를 사용할 수 있으며 MoveNext()로 진행하고 호출 할 때마다 현재 값을 반환합니까?열거자를 전진시키고 람다에서 그 값을 얻을 수 있습니까?
1
A
답변
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));
}