480 Stimmen

Warum gibt es keine ForEach-Erweiterungsmethode für IEnumerable?

Angeregt durch eine andere Frage nach dem fehlenden Zip Funktion:

Warum gibt es keine ForEach Erweiterungsmethode auf der IEnumerable Schnittstelle? Oder irgendwo? Die einzige Klasse, die eine ForEach Methode ist List<> . Gibt es einen Grund, warum sie fehlt, vielleicht die Leistung?

4voto

@Coincoin

Die wahre Stärke der foreach-Erweiterungsmethode liegt in der Wiederverwendbarkeit der Action<> ohne unnötige Methoden zu Ihrem Code hinzuzufügen. Nehmen wir an, Sie haben 10 Listen, für die Sie die gleiche Logik anwenden wollen, und eine entsprechende Funktion passt nicht in Ihre Klasse und wird nicht wiederverwendet. Anstatt zehn for-Schleifen oder eine generische Funktion zu haben, die offensichtlich ein Hilfsmittel ist, das nicht dazugehört, können Sie Ihre gesamte Logik an einem Ort aufbewahren (die Action<> . Dutzende von Zeilen werden also ersetzt durch

Action<blah,blah> f = { foo };

List1.ForEach(p => f(p))
List2.ForEach(p => f(p))

usw...

Die Logik ist an einem Ort und Sie haben Ihre Klasse nicht verschmutzt.

4voto

McKay Punkte 12080

Das liegt zum Teil daran, dass die Sprachdesigner aus philosophischer Sicht nicht damit einverstanden sind.

  • Eine Funktion nicht zu haben (und zu testen...) ist weniger Arbeit als eine Funktion zu haben.
  • Es ist nicht wirklich kürzer (es gibt einige Fälle, in denen es eine Übergangsfunktion ist, aber das wäre nicht die primäre Verwendung).
  • Sein Zweck ist es, Seiteneffekte zu haben, und das ist nicht das, worum es bei Linq geht.
  • Warum eine weitere Möglichkeit, das Gleiche zu tun wie eine Funktion, die wir bereits haben? (Schlüsselwort foreach)

https://blogs.msdn.microsoft.com/ericlippert/2009/05/18/foreach-vs-foreach/

3voto

TraumaPony Punkte 10670

Wenn Sie F# haben (das in der nächsten Version von .NET enthalten sein wird), können Sie

Seq.iter doSomething myIEnumerable

2voto

user18784 Punkte 21

Bin ich es oder ist die List<T>.Foreach ziemlich viel von Linq überflüssig gemacht worden. Ursprünglich gab es

foreach(X x in Y) 

wo Y einfach IEnumerable (Pre 2.0) sein und einen GetEnumerator() implementieren musste. Wenn Sie sich die generierte MSIL ansehen, können Sie feststellen, dass es genau dasselbe ist wie

IEnumerator<int> enumerator = list.GetEnumerator();
while (enumerator.MoveNext())
{
    int i = enumerator.Current;

    Console.WriteLine(i);
}

(Siehe http://alski.net/post/0a-for-foreach-forFirst-forLast0a-0a-.aspx für die MSIL)

Dann kamen in DotNet2.0 Generics und die List. Foreach hat sich für mich immer wie eine Implementierung des Vistor-Musters angefühlt (siehe Design Patterns von Gamma, Helm, Johnson, Vlissides).

In 3.5 können wir natürlich stattdessen ein Lambda verwenden, um denselben Effekt zu erzielen. http://dotnet-developments.blogs.techtarget.com/2008/09/02/iterators-lambda-and-linq-oh-my/

2voto

leppie Punkte 111830

Die meisten der LINQ-Erweiterungsmethoden geben Ergebnisse zurück. ForEach passt nicht in dieses Muster, da es nichts zurückgibt.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X