C # Unterschied zwischen First () und Find ()
Also ich weiß, dass Find()
ist nur ein List<T>
Methode, in der Erwägung, dass First()
ist eine Erweiterung für alle IEnumerable<T>
. Ich weiß auch, dass First()
wird das erste element zurückzugeben, wenn kein parameter übergeben wird, in der Erwägung, dass Find()
wird eine exception werfen. Schließlich weiß ich, dass First()
wird eine Ausnahme ausgelöst, wenn das element nicht gefunden, wohingegen Find()
zurück, geben Sie den Standardwert.
Ich hoffe, das klärt die Verwirrung über das, was ich wirklich bin, zu Fragen. Dies ist eine informatik Frage, und die beschäftigt sich mit diesen Methoden auf die rechnerische Ebene. Ich bin gekommen, zu verstehen, dass IEnumerable<T>
Erweiterungen nicht immer funktionieren, wie man erwarten würde, unter der Haube. So, hier ist der Q, und ich meine, von einem "nahe am Metall" Standpunkt: Was ist der Unterschied zwischen Find()
und First()
?
Hier finden Sie den code, um grundlegende Annahmen für den Betrieb unter diese Frage.
var l = new List<int> { 1, 2, 3, 4, 5 };
var x = l.First(i => i == 3);
var y = l.Find(i => i == 3);
Ist es, die tatsächliche rechnerische Differenz zwischen dem, wie First()
und Find()
entdecken Sie Ihre Werte in dem code oben?
Beachten Sie: Lassen Sie uns ignorieren Dinge wie AsParallel()
und AsQueryable()
für jetzt.
InformationsquelleAutor der Frage Squirrelsama | 2010-12-06
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hier ist der code für
List<T>.Find
(aus Reflektor):Und hier ist
Enumerable.First
:Also beide Methoden in etwa die gleiche Art und Weise: Sie Durchlaufen alle Elemente, bis Sie finden, das entspricht dem Prädikat. Der einzige auffällige Unterschied ist, dass
Find
verwendet einefor
Schleife, weil es bereits weiß, die Anzahl der Elemente, undFirst
verwendet eine foreach-Schleife, da Sie es nicht kennt.InformationsquelleAutor der Antwort Thomas Levesque
First
wird eine exception werfen, wenn es nichts findet,FirstOrDefault
jedoch macht genau das gleiche wieFind
(abgesehen von der Frage, wie es iteriert durch die Elemente).InformationsquelleAutor der Antwort Doggett
BTW Finden, ist eher gleich
FirstOrDefault()
alsFirst()
. Denn wenn PrädikatFirst()
ist nicht zufrieden mit der Liste alle Elemente, erhalten Sie eine Ausnahme.Hier was wieder ein dotpeek, eine andere große kostenlos Reflektor-Ersatz mit einigen von ReSharper-Funktionen
Hier für
Enumerable.First(...)
undEnumerable.FirstOrDefault(...)
extension Methoden:und hier ist für List<>.Finden:
InformationsquelleAutor der Antwort python_kaa
Seit
List<>
ist nicht indiziert in irgendeiner Weise, es hat zu gehen durch alle Werte zu finden, die einen bestimmten Wert. Von daher hat er nicht viel von einem Unterschied im Vergleich zum Durchlaufen der Liste über ein enumerable (abgesehen von der Schaffung einer aufzählbaren helper object-Instanz).Sagte, im Hinterkopf behalten, dass die
Find
Funktion wurde Weise früher als dieFirst
Erweiterung Methode (Framework V2.0 vs. V3.5), und ich bezweifle, dass Sie würden umgesetzt habenFind
wenn dieList<>
Klasse wurde implementiert in der gleichen Zeit wie die Erweiterung Methoden.InformationsquelleAutor der Antwort Lucero
Wäre es auch wahr, dass die Verwendung Finden, auf etwas, das ist ein enumerator, anstatt einer Liste wird ein potential haben, die Leistung Kosten, da ein enumerator kann nicht Holen die ganze Liste, die das Prädikat erfüllen? Umgekehrt, wenn Sie bereits über eine Liste, dann Finden Sie besser wäre.
InformationsquelleAutor der Antwort pkr2000