У меня есть 3 (Edit) взаимно исключающий IEnumerables, который я хочу перебрать. Я хочу сделать что-то вроде этого:Обо мне по коллекции 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 должно быть тривиальным.
Хех ... Я начал с Конката, а затем пошел в Союз, а потом решил, что не могу решить, что использовать, поэтому я удалил свой ответ. Мне нравится, что вы все объясняете разницу. +1 – Randolpho
Именно то, что я искал. Благодаря! – sdr
@sdr: Обратите внимание, что здесь есть компромисс между временем и пространством. Предположим, у вас было не три, а двадцать таких списков, каждая из которых насчитывала десять тысяч элементов. Ваш метод (объединить их все вместе в один большой список) занимает около 20 x 10K дополнительных ссылок и выполняет 20 x 10K операций копирования ссылок. С другой стороны, выполнение 20 наивных конкат, принимает нулевые дополнительные ссылки, но вложенные конкаты имеют нагрузку на копирование, основанную на их глубине вложенности, поэтому будет 10 x 11 x 10K = 110K копий, а не 20K копий. Подробнее см. Http://blogs.msdn.com/wesdyer/archive/2007/03/23/all-about-iterators.aspx. –