Foreach对IEnumerables的集合

时间:2010-03-22 20:48:46

标签: c# foreach ienumerable

我想要迭代3个(编辑)互斥 IEnumerables。我想做这样的事情:

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

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

...

我能想到的最好方法是:

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

有更简洁的方法吗?看起来像组合IEnumberables应该是微不足道的。

4 个答案:

答案 0 :(得分:20)

使用LINQ:

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

有关信息,UnionConcat之间的区别在于Union会做额外的工作来保证唯一性;所以如果你不期待重复(或者不介意),那么Concat会更快。

答案 1 :(得分:3)

正如其他答案所述,Union做了额外的工作来消除重复,Concat简单地连接序列。但是,正如我在上面的评论中指出的那样,深度嵌套的concats存在性能成本。您可以考虑使用SelectMany来展平一堆迭代器:

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

如果您发现实际上有三个以上的列表要迭代,您可能会发现更灵活。

答案 2 :(得分:0)

使用LINQ Union方法。

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

答案 3 :(得分:0)

是否有理由需要在一个循环中执行此操作?如果是这样,第二种方式可能是最好的。没有什么能像第一种方式那样起作用。

除非在一个循环中有一个重要的需要,否则我会在三个循环中完成它,这样会更有时间效率。