Unterschied zwischen linq.first () und array [0] [duplizieren]

8

Ich frage mich, was passiert unter der Haube von list.first () und Liste [0] und welche besser funktioniert.

Zum Beispiel was ist schneller?

%Vor%

Entschuldigung Im Falle einer doppelten Frage

    
dev hedgehog 01.09.2014, 13:28
quelle

4 Antworten

6

Was ist besser? Der Array-Accessor, da dieser keine Methode benötigt, um auf den Stack gesetzt zu werden und nicht die First -Methode ausführen muss, um eventuell zum Array-Accessor zu gelangen.

Wie die Referenzquelle von Enumerable zeigt, ist First() eigentlich:

%Vor%

Es macht also nichts anderes, es braucht nur mehr Schritte, um dorthin zu gelangen.

Für Ihren zweiten Teil ( list.Where(x => x > 1).First() vs. list.Where(x => x > 1).ToList()[0] ):

Where gibt eine IEnumerable zurück, was nicht IList ist, also geht es nicht für den ersten Teil der First -Methode, sondern den zweiten Teil:

%Vor%

Dadurch wird jedes Element einzeln durchlaufen, bis es den gewünschten Index erhält. In diesem Fall 0 , so wird es bald sehr . Der andere, der ToList aufruft, wird immer weniger effizient sein, da er ein neues Objekt erstellen und alle Elemente dort hineinlegen muss, um das erste zu erhalten. Der erste Anruf ist definitiv schneller.

    
Patrick Hofman 01.09.2014, 13:30
quelle
3

Einfache Verdichtung der Leistung Ссылка

%Vor%

Erst gegen [0] Wenn du ein einfaches Array schneller hast, ist [0], weil es nur Addierer im Speicher berechnet. aber wenn Sie mit anderen LINQ-Befehl schneller kombinieren, ist First (). zum Beispiel Where (). First () sucht, bis er das erste Element findet. Where (). ToList () [0] findet alle Elemente, konvertiert sie in eine Liste und führt eine einfache Berechnung durch.

Eine andere Sache ist, dass Where () eine verzögerte Methode ist. Eine Abfrage, die nur verzögerte Methoden enthält, wird erst ausgeführt, wenn die Elemente im Ergebnis aufgelistet sind. also kannst du

%Vor%

13 wird an das Ergebnis angehängt, aber 10 nein, weil 10 und 13 zuerst zur Liste hinzugefügt wurden, nachdem die Liste durchsucht wurde.

Wenn Sie mehr über Linq erfahren möchten, können Sie dieses Buch lesen Pro LINQ von Joseph Rattz und Adam Freeman Ссылка

>     
Sylwekqaz 01.09.2014 14:25
quelle
1

Es gibt keinen signifikanten Unterschied zwischen diesen, Sie werden ziemlich die gleichen Ergebnisse erhalten:

%Vor%

Für Ihren zweiten Vergleich fragen Sie hier nur das erste Element

%Vor%

Sobald also WhereIterator einen Gegenstand zurückgibt, ist es erledigt. Aber in der Sekunde, die Sie alle Ergebnisse in Liste setzen und dann das erste Element mit Indexer erhalten, wird es daher langsamer sein.

    
Selman Genç 01.09.2014 13:37
quelle
1
  • list.Where(x => x > 1).First() vs. list.Where(x => x > 1).ToList()[0]

    Die erste () sollte schneller sein, wenn sie auf Enumerable angewendet wird verzögerte Ausführung. In Ihrem Fall wird das Ergebnis so bald wie möglich zurückgegeben Es wurde ein Element Ihrer Liste gefunden, das den Kriterien entspricht Wo (x = & gt; x & gt; 1) .

    Im zweiten Beispiel muss Ihre ursprüngliche Liste vollständig aufgelistet sein, Alle Elemente, die den Kriterien entsprechen, werden in eine temporäre Liste eingefügt, von der Sie das erste Element mit dem Array-Accessor erhalten.

  • str.Split(';').First() vs. str.Split(';')[0]

    In diesem Fall gibt die Methode Split () bereits ein Array zurück. Der Array-Zugriffsmechanismus ist möglicherweise geringfügig schneller, aber die Leistungssteigerung ist in den meisten Fällen vernachlässigbar.

Ndech 01.09.2014 13:36
quelle

Tags und Links