我想要迭代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应该是微不足道的。
答案 0 :(得分:20)
使用LINQ:
foreach(car in redCars.Concat(greenCars).Concat(blueCars)) {
//...
}
有关信息,Union
和Concat
之间的区别在于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)
是否有理由需要在一个循环中执行此操作?如果是这样,第二种方式可能是最好的。没有什么能像第一种方式那样起作用。
除非在一个循环中有一个重要的需要,否则我会在三个循环中完成它,这样会更有时间效率。