Можно ли продвинуть счетчик и получить его значение в лямбде? - PullRequest
1 голос
/ 16 сентября 2008

Если у меня есть переменная IEnumerator, возможно ли иметь лямбда-функцию, которая принимает ее, перемещает ее с помощью MoveNext () и возвращает текущее значение каждый раз, когда ее вызывают?

Ответы [ 4 ]

4 голосов
/ 16 сентября 2008
e => e.MoveNext() ? e.Current : null

Это будет перечислять перечислитель, возвращать текущее значение и возвращать ноль после завершения перечисления.

1 голос
/ 16 сентября 2008

Лямбда-выражение может содержать сложные операторы, поэтому вы можете делать следующее:

Func<IEnumerator, object> f = ie => { ie.MoveNext(); return ie.Current; };
0 голосов
/ 16 сентября 2008

Расширяя решение 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));
}
0 голосов
/ 16 сентября 2008

Это то, что вы ищете?

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 + " ");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...