Verwendet linq in dieser Situation Overkill

8

Ich denke über einen Re-Faktor nach, aber ich weiß nicht, ob das Endergebnis einfach übertrieben ist. Zur Zeit habe ich

%Vor%

Wäre es zuviel und / oder weniger effizient, linq für ForEach zu verwenden

? %Vor%

Würde die Besetzung hier ein bedeutender Overhead sein?

    
Andrew 03.02.2010, 10:52
quelle

6 Antworten

4

Die ToList-Methode ist eine mit LINQ verwendete Erweiterungsmethode, aber die ForEach-Methode ist nur eine Methode in der List-Klasse.

Der Haupt-Overhead ist hier der Aufruf der ToList-Methode, die eine neue Liste aus der Sammlung erstellt. Das ForEach hat auch einen geringen Overhead, da es einen Delegaten für jedes Element aufrufen muss.

Wenn Sie LINQ-Methoden verwenden möchten, scheint die Aggregatmethode besser geeignet zu sein:

%Vor%

oder Summe:

%Vor%

Sie haben entweder einen leichten Overhead gegenüber Ihrer ursprünglichen Version. Wenn Sie also am effizientesten arbeiten möchten, halten Sie sich einfach an eine einfache Schleife.

    
Guffa 03.02.2010, 11:02
quelle
7

Warum nicht den SUM -Operator direkt auf der IList verwenden?

Es hat mehrere Überladungen mit Func delegates:

%Vor%     
Oded 03.02.2010 10:56
quelle
3

Der Overhead wird die Sammlung zweimal durchlaufen.

%Vor%

ToList führt die Iteration nicht wie die meisten LINQ-Anweisungen auf träge Weise aus. Daher wird der Code gezwungen, zweimal über die Auflistung zu iterieren.

Im Allgemeinen scheint das LINQ-Formular besser zu lesen, aber wenn Sie sich Sorgen um die Leistung machen, vermeiden Sie es besser.

    
Elisha 03.02.2010 10:55
quelle
3

ForEach ist nicht Teil von LINQ - es ist Teil der List<T> API und ist seit .NET 2.0.

Der Grund dafür, dass es nicht Teil von LINQ ist, ist, dass es sich um eine natürlich nebenwirkende Methode handelt ... und LINQ fördert keine Nebenwirkungen.

Die Verwendung von Sum ist hier die richtige Lösung, aber Sie müssen zuerst keine Liste erstellen:

%Vor%     
Jon Skeet 03.02.2010 11:01
quelle
2

Verwenden Sie wie Oded SUM

%Vor%     
Johnno Nolan 03.02.2010 10:59
quelle
1

Tu es nicht so.
Die ToList() hier wird eine neue Liste zuweisen und füllen, IMHO nicht notwendig. Während es eine triviale Übung ist, eine ForEach-Erweiterungsmethode zu schreiben, um über jedes Objekt zu iterieren, das IEnumberable implementiert, würde ich davon abraten (siehe diesen Artikel von Eric Lippert foreach Vs ForEach ).

Ich würde mit der foreach gehen.

P.S. Sie müssen IncrementTot initialisieren (Entschuldigung, ich konnte mir nicht helfen)

    
Binary Worrier 03.02.2010 10:58
quelle

Tags und Links