質問
IEnumerator 変数がある場合、それを受け取り、MoveNext() でそれを進め、呼び出されるたびに現在の値を返すラムダ関数を使用することは可能ですか?
解決
e => e.MoveNext() ? e.Current : null
これにより、列挙子が進められ、現在の値が返され、列挙が完了すると null が返されます。
他のヒント
ラムダ式には複雑なステートメントを含めることができるため、次のことが可能です。
Func<IEnumerator, object> f = ie => { ie.MoveNext(); return ie.Current; };
これがあなたが探しているものですか?
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 + " ");
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));
}
所属していません StackOverflow