Frage

Ich war gespannt, wie die SingleOrFallback Methode implementiert wurde in MoreLinq und etwas entdeckt ich hatte nicht gesehen, vor:

    public static T SingleOrFallback<T>(this IEnumerable<T> source, Func<T> fallback)
    {
        source.ThrowIfNull("source");
        fallback.ThrowIfNull("fallback");
        using (IEnumerator<T> iterator = source.GetEnumerator())
        {
            if (!iterator.MoveNext())
            {
                return fallback();
            }
            T first = iterator.Current;
            if (iterator.MoveNext())
            {
                throw new InvalidOperationException();
            }
            return first;
        }
    }

Warum ist die IEnumerator<T> in einer using Aussage? Ist das etwas, über das man dachte, sollte bei der Verwendung der foreach auf einem IEnumerable<T> auch?

Side Frage: Was bedeutet diese Methode genau? Hat es den Fehlerpunkt zurückkehren, wenn die Quellsequenz nicht enthält genau ein Element?

War es hilfreich?

Lösung

IEnumerator<T> erstreckt IDisposable, so dass Sie sollte hat es in einer using-Anweisung. foreach tut dies automatisch. (Der nicht-generic IEnumerator nicht erweitern IDisposable aber die C # Compiler generiert noch Code Dispose bedingt zu nennen. Dies war einer der (wenige) Änderungen zwischen C # 1.0 und 1.2, wobei 1.2 die Version Versand mit .NET 1.1, aus irgendeinem Grunde.)

Hier ist ein Artikel zu erklären, warum dies wichtig ist im Zusammenhang mit den Iterator Blöcken.

Wie für das, was die Methode funktioniert:

  • Wenn die Sequenz leer ist, geben Sie den Ausweichpunkt
  • Wenn die Folge genau ein Element hat, zurückgeben
  • Wenn die Sequenz mehr als ein Element hat, wirft eine Ausnahme

PS: Nice MoreLinq wird immer etwas Aufmerksamkeit zu sehen:)

Andere Tipps

werden einige Aufzählungen verhalten schlecht, wenn Entsorgen nicht genannt wird; dies gilt ebenso für die nicht-generischen als die generischen (die nicht-generischen verlangt, dass Code entweder Ente-Typ den Dispose Anruf oder anderen IDisposable gegossen und dann rufen IDisposable.Dispose). Es ist gut, als eine Frage der Gewohnheit, um sicherzustellen, dass IEnumerator Objekte erhalten angeordnet; Ich würde es für Richtigkeit der Routine für erforderlich halten, die ein IEnumerable unbekannte Art akzeptiert.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top