foreach loop vs. ForEach Methode - Unterschiede? [Duplikat]

8

EDIT: Diese Frage kann als ein Duplikat von diese Frage markiert werden.

>

Gibt es Unterschiede (Leistung oder anderes) zwischen der Verwendung einer foreach-Schleife oder der Methode ForEach LINQ ?

Für den Kontext ist dies Teil einer meiner Methoden:

%Vor%

Alternativ kann ich diesen Code verwenden, um dieselbe Aufgabe auszuführen:

%Vor%

Wann wäre die Schleifenstruktur besser als die Methodenverkettung?

Hier ist ein anderes Beispiel, in dem ich die Methode ForEach verwendet habe, aber einfach eine foreach-Schleife und eine Variable verwendet haben könnte:

%Vor%     
Jake 02.11.2015, 15:13
quelle

3 Antworten

4

Ich würde Sie bitten, Eric Lipperts Blog "foreach" vs "ForEach" . Als der letzte Hauptentwickler des C # -Compiler-Teams denke ich, dass seine Meinung genau richtig ist.

Auszug: (bezogen auf .ForEach() )

  

Der erste Grund ist, dass dies die funktionalen Programmierprinzipien verletzt, auf denen alle anderen Sequenzoperatoren basieren. Eindeutig ist der einzige Zweck eines Aufrufs zu dieser Methode, Nebenwirkungen zu verursachen . Der Zweck eines Ausdrucks besteht darin, einen Wert zu berechnen, um keine Nebenwirkung zu verursachen. Der Zweck einer Aussage ist, einen Nebeneffekt zu verursachen. Die Aufrufseite dieser Sache würde sehr nach einem Ausdruck aussehen (obwohl, zugegeben, da die Methode leer ist, kann der Ausdruck nur in einem "Anweisungsausdruck" Kontext verwendet werden.) Es passt nicht gut zu mir mache den einzigen Sequenzoperator, der nur für seine Nebenwirkungen nützlich ist.

    
Erik Philips 02.11.2015 17:26
quelle
0

Die Schleife ist besser, weil es ein Werkzeug ist, das genau für das gemacht wird, was Sie machen wollen. Es integriert sich besser in die Sprache. Zum Beispiel können Sie aus einer Schleife ausbrechen. Werkzeuge verstehen Schleifen, sie verstehen ForEach nicht.

Die Schleife ist auch für Menschen leichter zu verstehen. ForEach ist sehr ungewöhnlich.

Die Schleife ist auch schneller, da es weniger indirekte Aufrufe gibt, weniger Delegiertenzuweisungen und der Optimierer mehr von dem sehen kann, was Sie an einem Ort tun. Es speichert auch den Aufruf ToList . Sie könnten diesen Aufruf speichern, indem Sie eine benutzerdefinierte Erweiterungsmethode für IEnumerable<T> schreiben.

Ich denke, die Schleife ist in allen Fällen überlegen, die ich mir vorstellen kann. Vielleicht gibt es einen Eckfall, bei dem die ForEach -Methode aus irgendeinem Grund besser oder besser geeignet wäre.

PLINQ hat auch eine ForAll , die aus Effizienzgründen benötigt wird, da sie parallelisiert werden kann.

    
usr 02.11.2015 15:18
quelle
-3

In den meisten Fällen handelt es sich um persönliche Vorlieben. Apropos Leistung:

In den meisten Fällen ist LINQ etwas langsamer, da Overhead eingeführt wird. Verwenden Sie LINQ nicht, wenn Sie viel Wert auf Leistung legen. Verwenden Sie LINQ, weil Sie einen besser lesbaren und wartbaren Code benötigen.

    
Kai 02.11.2015 15:18
quelle

Tags und Links