8 Stimmen

Foreach über eine Sammlung von IEnumerables

Ich habe 3 (Bearbeiten) schließen sich gegenseitig aus IEnumerables, über die ich iterieren möchte. Ich möchte etwas wie dieses tun:

IEnumerable<Car> redCars = GetRedCars();
IEnumerable<Car> greenCars = GetGreenCars();
IEnumerable<Car> blueCars = GetBlueCars();

foreach(Car c in (redCars + greenCars + blueCars)) {
    c.DoSomething();
}

...

Die beste Möglichkeit, die mir einfällt, ist:

...
List<Car> allCars = new List();
allCars.AddRange(redCars);
allCars.AddRange(greenCars);
allCars.AddRange(blueCars);
foreach(car in allCars) {
    ...
}
...

Gibt es eine präzisere Methode, dies zu tun? Scheint wie Kombinieren IEnumberables sollte trivial sein.

20voto

Marc Gravell Punkte 970173

Mit LINQ:

foreach(car in redCars.Concat(greenCars).Concat(blueCars)) {
    //...
}

Zur Information, der Unterschied zwischen Union y Concat ist das Union wird zusätzliche Arbeit leisten, um die Einzigartigkeit zu garantieren; wenn Sie also nicht erwarten Duplikate (oder alternativ: stören Sie sich nicht daran), dann Concat ist schneller.

3voto

Eric Lippert Punkte 628543

Wie in anderen Antworten erwähnt, macht Union zusätzliche Arbeit, um Duplikate zu eliminieren, während Concat einfach die Sequenzen verkettet. Wie ich jedoch in einem Kommentar weiter oben angemerkt habe, gibt es Leistungseinbußen bei tief verschachtelten Verkettungen. Sie könnten auch erwägen, ein SelectMany zu verwenden, um eine Reihe von Iteratoren zu glätten:

var carLists = new[]{GetRedCars(), GetGreenCars(), GetBlueCars()};
var allCars = from carList in carLists
              from car in carList 
              select car;
foreach(var c in allCars) { ... }

Das könnte sich als flexibler erweisen, wenn Sie feststellen, dass Sie weit mehr als drei Listen zu iterieren haben.

0voto

Elisha Punkte 22640

LINQ Union-Methode verwenden.

foreach(Car c in redCars.Union(greenCars).Union(blueCars))
{
    c.DoSomething();
}

0voto

Scott J Punkte 1261

Gibt es einen Grund dafür, dass Sie es in einer Schleife tun müssen? Wenn ja, ist die zweite Möglichkeit wahrscheinlich die beste. Es gibt nichts, was so funktioniert wie der erste Weg.

Wenn es nicht zwingend notwendig ist, es in einer Schleife zu machen, würde ich es in drei Schleifen machen, was zeitsparender wäre.

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