Ist es möglich, einen Enumerator zu fördern und seinen Wert in einem Lambda bekommen?

StackOverflow https://stackoverflow.com/questions/72913

  •  09-06-2019
  •  | 
  •  

Frage

Wenn ich ein IEnumerator Variable ist es möglich, eine Lambda-Funktion zu haben, die es dauert, geht es mit Movenext () und gibt den aktuellen Wert jedes Mal seinen Namen?

War es hilfreich?

Lösung

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

Dies wird die enumerator vorrücken und den aktuellen Wert zurück, und null zurück, wenn die Aufzählung vollständig ist.

Andere Tipps

Ein Lambda-Ausdruck kann komplexe Aussagen enthalten, so dass Sie Folgendes ausführen können:

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

Ist das, was Sie suchen?

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 + " ");
}

Der Punkt eines IEnumerator ist, dass Sie bereits syntaktischen Zucker behandeln es bekommen:

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

Handhabung Auch der Enumerator schaut direkt cleaner in diesem Fall:

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

Die Ausweitung auf Abes Lösung können Sie auch Verschlüsse verwenden, um einen Verweis auf die enumerator zu halten:

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));
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top