Ich betrachte einen Code, der ein IEnumerable<T>
akzeptiert und in den Code konvertiert a List<T>
, damit es List<T>.Find(predicate)
:
Gibt es eine Möglichkeit, dies mit den LINQ-Erweiterungsmethoden neu zu schreiben hat den gleichen Effekt, aber ohne einen zusätzlichen List<T>
als Zwischenschritt zu erstellen?
Die Erweiterungsmethode FirstOrDefault(source, predicate)
sieht wie ein guter Kandidat aus, versucht aber herauszufinden Wenn es genau ist entspricht Find
meinem Kopf weh zu tun.
Hier nur zur Referenz: Hier sehen Sie eine Tabelle mit einigen alten .NET 2-Style List<>
-Instanzmethoden und ihren entsprechenden Erweiterungsmethoden in Linq:
Natürlich sind einige von ihnen nicht völlig gleichwertig. Insbesondere verwenden die Where
und Select
von Linq die verzögerte Ausführung, während FindAll
und ConvertAll
von List<>
sofort ausgeführt werden und einen Verweis auf eine neue List<>
-Instanz zurückgeben.
FindLast
ist oft schneller als LastOrDefault
, weil FindLast
tatsächlich ab dem Ende von List<>
sucht. Auf der anderen Seite läuft LastOrDefault(predicate)
immer durch die gesamte Sequenz (beginnend mit dem ersten Element) und gibt dann nur die "letzte" Übereinstimmung zurück.