wake-up-neo.net

Linq-Stil "Für jeden"

Mögliches Duplikat:
Linq-Äquivalent von foreach für IEnumerable

Gibt es eine Linq-Syntax für "For each" -Operationen?

Fügen Sie beispielsweise Werte basierend auf einer Sammlung zu einer anderen hinzu, die bereits vorhanden ist:

IEnumerable<int> someValues = new List<int>() { 1, 2, 3 };

IList<int> list = new List<int>();

someValues.ForEach(x => list.Add(x + 1));

Anstatt von

foreach(int value in someValues)
{
  list.Add(value + 1);
}
173

Verwenden Sie am besten die Erweiterungsmethode ToList ():

someValues.ToList().ForEach(x => list.Add(x + 1));

In der BCL gibt es keine Erweiterungsmethode, die ForEach direkt implementiert.


Obwohl es in der [~ # ~] bcl [~ # ~] keine Erweiterungsmethode gibt, die dies tut, gibt es ist immer noch eine Option im System-Namespace ..., wenn Sie Reactive Extensions zu Ihrem Projekt hinzufügen:

using System.Reactive.Linq;

someValues.ToObservable().Subscribe(x => list.Add(x + 1));

Dies hat das gleiche Endergebnis wie die obige Verwendung von ToList, ist jedoch (theoretisch) effizienter, da die Werte direkt an den Delegaten übertragen werden.

253
Mark Seemann

Die Array und List<T> Klassen haben bereits ForEach Methoden, allerdings nur diese spezielle Implementierung. (Beachten Sie, dass ersteres übrigens static ist).

Nicht sicher, ob es wirklich einen großen Vorteil gegenüber einer foreach -Anweisung bietet, aber Sie könnten eine Erweiterungsmethode schreiben, um die Aufgabe für alle zu erledigen IEnumerable<T> Objekte.

public static void ForEach<T>(this IEnumerable<T> source, Action<T> action)
{
    foreach (var item in source)
        action(item);
}

Auf diese Weise kann der genaue Code, den Sie in Ihrer Frage angegeben haben, genau nach Ihren Wünschen funktionieren.

92
Noldorin

Es ist nichts eingebaut, aber Sie können einfach Ihre eigene Erweiterungsmethode erstellen, um dies zu tun:

public static void ForEach<T>(this IEnumerable<T> source, Action<T> action)
{
    if (source == null) throw new ArgumentNullException("source");
    if (action == null) throw new ArgumentNullException("action");

    foreach (T item in source)
    {
        action(item);
    }
}
31
LukeH

Die offizielle MS-Linie lautet "weil es keine funktionierende Operation ist" (dh es ist eine zustandsbehaftete Operation).

Könntest du nicht so etwas machen wie:

list.Select( x => x+1 )

oder wenn du es wirklich in einer Liste brauchst:

var someValues = new List<int>( list.Select( x => x+1 ) );
18
stusmith

Es gibt keine Linq ForEach-Erweiterung. Die Klasse List verfügt jedoch über eine ForEach-Methode, wenn Sie bereit sind, List direkt zu verwenden.

Die Standardsyntax foreach liefert die gewünschten Ergebnisse und ist wahrscheinlich einfacher zu lesen:

foreach (var x in someValues)
{
    list.Add(x + 1);
}

Wenn Sie unnachgiebig sind, möchten Sie eine Erweiterung im Linq-Stil. Es ist trivial, dies selbst umzusetzen.

public static void ForEach<T>(this IEnumerable<T> @this, Action<T> action)
{
   foreach (var x in @this)
      action(x);
}
4
dustyburwell

In Standard-Linq gibt es so etwas nicht, aber in MoreLinq gibt es einen ForEach-Operator.