Wenn Sie LINQ verwenden können, können Sie Folgendes verwenden:
var e = enumerable.First();
Dies löst jedoch eine Ausnahme aus, wenn enumerable leer ist. In diesem Fall können Sie Folgendes verwenden:
var e = enumerable.FirstOrDefault();
FirstOrDefault()
wird zurückgegeben, default(T)
wenn die Aufzählung leer ist, was null
für Referenztypen oder der Standardwert 'Nullwert' für Werttypen gilt.
Wenn Sie LINQ nicht verwenden können, ist Ihr Ansatz technisch korrekt und unterscheidet sich nicht vom Erstellen eines Enumerators mit den Methoden GetEnumerator
und MoveNext
zum Abrufen des ersten Ergebnisses (in diesem Beispiel wird davon ausgegangen, dass Enumerable ein ist IEnumerable<Elem>
):
Elem e = myDefault;
using (IEnumerator<Elem> enumer = enumerable.GetEnumerator()) {
if (enumer.MoveNext()) e = enumer.Current;
}
Joel Coehoorn erwähnt .Single()
in den Kommentaren; Dies funktioniert auch, wenn Sie erwarten, dass Ihre Aufzählung genau ein Element enthält. Es wird jedoch eine Ausnahme ausgelöst, wenn sie entweder leer oder größer als ein Element ist. Es gibt eine entsprechende SingleOrDefault()
Methode, die dieses Szenario auf ähnliche Weise abdeckt wie FirstOrDefault()
. Doch David B erklärt , dass SingleOrDefault()
immer noch eine Ausnahme in dem Fall werfen kann , wenn die zählbaren mehr als ein Element enthält.
Bearbeiten: Vielen Dank an Marc Gravell, der darauf hingewiesen hat, dass ich mein IEnumerator
Objekt nach der Verwendung entsorgen muss. Ich habe das Nicht-LINQ-Beispiel bearbeitet, um das using
Schlüsselwort zur Implementierung dieses Musters anzuzeigen .
Nur für den Fall, dass Sie .NET 2.0 verwenden und keinen Zugriff auf LINQ haben:
Dies sollte das tun, wonach Sie suchen ... es werden Generika verwendet, damit Sie das erste Element für einen beliebigen IEnumerable-Typ erhalten.
Nennen Sie es so:
Oder
Sie können es leicht genug ändern, um die IEnumerable.ElementAt () -Erweiterungsmethode von .NET 3.5 nachzuahmen:
Nennen wir es so:
Natürlich , wenn Sie tun Zugang zu LINQ haben, dann gibt es viele gute Antworten bereits gebucht ...
quelle
Nun, Sie haben nicht angegeben, welche Version von .Net Sie verwenden.
Angenommen, Sie haben 3.5, ist die ElementAt-Methode eine andere Möglichkeit:
quelle
FirstOrDefault ?
quelle
Versuche dies
quelle
Verwenden Sie FirstOrDefault oder eine foreach-Schleife, wie bereits erwähnt. Das manuelle Abrufen eines Enumerators und das Aufrufen von Current sollten vermieden werden. foreach entsorgt Ihren Enumerator für Sie, wenn er IDisposable implementiert. Wenn Sie MoveNext und Current aufrufen, müssen Sie es manuell entsorgen (falls zutreffend).
quelle
Wenn Ihr IEnumerable es nicht verfügbar macht
<T>
und Linq fehlschlägt, können Sie eine Methode mithilfe von Reflection schreiben:quelle
Sie können auch die allgemeinere Version ausprobieren, die Ihnen das i-te Element gibt
enumerable.ElementAtOrDefault (i));
ich hoffe es hilft
quelle