Ich habe eine Linq-Anweisung wie folgt:
%Vor%Meine Frage ist: Wie oft wird records.Sum (r = & gt; r.b) in der letzten Zeile berechnet? Läuft LINQ über alle Datensätze jedes Mal, wenn es eine Summe berechnen muss (in diesem Fall 3 Sum () also Schleife dreimal)? Oder schleift es geschickt alle Datensätze einmal durch und berechnet alle Summen?
Bearbeiten 1 :
Ich frage mich, ob es einen Weg gibt, es zu verbessern, indem ich nur alles durchlaufe die Datensätze sind nur einmal (wir müssen es nur in einer einzigen Schleife machen) Wenn Sie eine einfache Schleife verwenden)?
Und es ist wirklich nicht nötig, alles vorher in den Speicher zu laden wir können die Summe und den Durchschnitt machen . Sicher können wir jedes Element summieren während es aus der Datei geladen wird. Gibt es eine Möglichkeit, den Speicher zu reduzieren? Verbrauch auch?
Bearbeiten 2
Nur um ein bisschen zu verdeutlichen, ich habe LINQ nicht benutzt, bevor ich wie oben gelandet bin. Durch die Verwendung der einfachen while / for-Schleife können alle Leistungsanforderungen erfüllt werden. Aber ich habe dann versucht, die Lesbarkeit zu verbessern und auch die Codezeilen mit LINQ zu reduzieren. Es scheint, dass wir beide nicht gleichzeitig bekommen können.
Es gibt viele Antworten, aber keine, die all Ihre Fragen aufgreifen.
Wie oft wird records.Sum (r = & gt; r.b) in der letzten Zeile berechnet?
Drei Mal.
Überlappt LINQ jedes Mal die Datensätze, wenn es berechnet werden muss eine Summe (in diesem Fall 3 Sum () also Schleife 3 mal)?
Ja.
Oder scrollen Sie einfach alle Datensätze einmal durch und berechnen Sie alle die Summen?
Nein.
Ich frage mich, ob es einen Weg gibt, es zu verbessern, indem ich nur alles durchlaufe die Aufzeichnungen nur einmal (wie wir es nur in einer einzigen Schleife tun müssen, wenn Verwenden Sie eine einfache for-Schleife)?
Sie können das tun, aber Sie müssen alle Daten eifrig laden, die Ihrer nächsten Frage widersprechen.
Und es ist wirklich nicht nötig, alles vorher in den Speicher zu laden kann die Summe und den Durchschnitt machen. Sicher können wir jedes Element währenddessen summieren Laden Sie es aus der Datei. Gibt es eine Möglichkeit, den Speicher zu reduzieren? Verbrauch auch?
Das ist richtig. In Ihrem ursprünglichen Post haben Sie eine Variable mit dem Namen myFile
und Sie werden darüber iterieren und in eine lokale Variable namens line
(lesen: im Grunde eine foreach
) setzen. Da Sie nicht gezeigt haben, wie Sie Ihre myFile
-Daten erhalten haben, gehe ich davon aus, dass Sie alle Daten eifrig laden.
Hier ist ein kurzes Beispiel für das lazy-Laden Ihrer Daten:
%Vor% Dreimal, und was Sie hier verwenden sollten, ist Aggregate
, nicht Sum
.
Jeder Aufruf der Methode Sum durchläuft alle Zeilen in myfile. Um die Leistung zu verbessern, schreiben Sie:
%Vor%Damit würde die Liste mit allen Elementen (mit "a" - und "b" -Eigenschaften) erstellt und dann wird jeder Aufruf der Sum-Methode durch diese Liste iterieren, ohne Daten zu teilen und zu analysieren. Natürlich können Sie noch weiter gehen und sich das Ergebnis der Sum-Methode in einer temporären Variablen merken.
James, ich bin kein Experte überhaupt, das ist meine Idee. Ich denke, es kann auf 1 reduziert werden. Vielleicht gibt es ein bisschen mehr Code. records ist immer noch IEnumerable von AnonymousType {int a, int b}.
* Dynamic war ein schneller Weg, um es zu lösen. Sie sollten eine Struktur dafür schreiben.
%Vor%Für andere Strukturen ist es einfach.
%Vor%Dann
%Vor%SUM ruft alle Datensätze auf, wenn Sie es aufrufen. Ich empfehle Ihnen, ToList () - & gt; Führen Sie ToList ()?
aus %Vor%