1

IEnumerator 変数がある場合、それを受け取り、MoveNext() でそれを進め、呼び出されるたびに現在の値を返すラムダ関数を持つことは可能ですか?

4

4 に答える 4

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

これにより、列挙子が進められて現在の値が返され、列挙が完了すると null が返されます。

于 2008-09-16T14:36:12.427 に答える
1

Lambda 式には複雑なステートメントを含めることができるため、次のことができます。

Func<IEnumerator, object> f = ie => { ie.MoveNext(); return ie.Current; };
于 2008-09-16T14:33:00.593 に答える
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 + " ");
}

an のポイントは、IEnumeratorそれを処理するための構文糖衣を既に取得しているということです。

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

この場合、列挙子を直接処理することさえよりきれいに見えます:

while (e.MoveNext())
    Console.Write(e.Current + " ");
于 2008-09-16T14:38:54.980 に答える
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));
}
于 2008-09-16T14:40:14.210 に答える