Kann jemand erklären, wie LINQ funktioniert Wo (..) und FindAll (..) sich unterscheiden? Sie scheinen beide dasselbe zu tun ...
Kann jemand erklären, wie LINQ funktioniert Wo (..) und FindAll (..) sich unterscheiden? Sie scheinen beide dasselbe zu tun ...
Antworten:
FindAll()
ist eine Funktion für den List<T>
Typ, es ist keine LINQ-Erweiterungsmethode wie Where
. Die LINQ-Erweiterungsmethoden funktionieren für jeden Typ, der implementiert wird IEnumerable
, während FindAll
sie nur für List<T>
Instanzen (oder natürlich für Instanzen von Klassen, die davon erben) verwendet werden können.
Darüber hinaus unterscheiden sie sich im tatsächlichen Zweck. Where
Gibt eine Instanz zurück IEnumerable
, die bei Bedarf ausgeführt wird, wenn das Objekt aufgelistet wird. FindAll
Gibt eine neue zurück List<T>
, die die angeforderten Elemente enthält. FindAll
ist eher wie das Aufrufen Where(...).ToList()
einer Instanz von IEnumerable
.
Der größte Unterschied für mich ist, dass .FindAll auch in .Net 2.0 verfügbar ist. Ich habe nicht immer den Luxus, in .Net 3.5 zu programmieren, daher versuche ich, mich an die "nativen" Methoden der generischen .Net-Sammlungen zu erinnern.
Es kam mehrmals vor, dass ich selbst eine bereits verfügbare List-Methode implementiert habe, weil ich sie nicht LINQ konnte.
Was ich in diesem Fall praktisch finde , ist , dass mit VS2008, ich kann Typinferenz und die Lambda - Syntax verwenden. Dies sind Compiler-Funktionen, keine Framework-Funktionen. Dies bedeutet, dass ich dies schreiben und trotzdem in .Net 2.0 bleiben kann:
var myOddNums = myNums.FindAll(n => n%2==1);
Wenn Sie jedoch über LINQ verfügen, ist es wichtig, den Unterschied zwischen verzögerter Ausführung und sofortiger Ausführung beizubehalten.
Wenn ich mich richtig erinnere, besteht der Hauptunterschied (abgesehen von dem, worauf sie implementiert sind: IEnumerable<T>
vs. List<T>
) darin, dass Where
eine verzögerte Ausführung implementiert wird, bei der die Suche erst dann durchgeführt wird, wenn Sie sie benötigen - beispielsweise in einer foreach-Schleife. FindAll
ist eine sofortige Ausführungsmethode.
Ich habe einige Tests mit einer Liste von 80K-Objekten durchgeführt und festgestellt, dass Find()
diese bis zu 1000% schneller sein können als die Verwendung eines Where
with FirstOrDefault()
. Das wusste ich erst, als ich vor und nach jedem Anruf einen Timer testete. Manchmal war es die gleiche Zeit, manchmal war es schneller.