Tengo 3 (Editar) mutuamente excluyentes IEnumerables que quiero iterar. Quiero hacer algo como esto:Foreach sobre una colección de IEnumerables
IEnumerable<Car> redCars = GetRedCars();
IEnumerable<Car> greenCars = GetGreenCars();
IEnumerable<Car> blueCars = GetBlueCars();
foreach(Car c in (redCars + greenCars + blueCars)) {
c.DoSomething();
}
...
La mejor manera que puedo pensar es:
...
List<Car> allCars = new List();
allCars.AddRange(redCars);
allCars.AddRange(greenCars);
allCars.AddRange(blueCars);
foreach(car in allCars) {
...
}
...
¿Existe una manera más concisa para hacer esto? Parece que combinar IEnumberables debería ser trivial.
Heh ... Empecé con Concat y luego fui a Union y luego decidí que no podía decidir cuál usar, así que borré mi respuesta. Me gusta el tuyo explicando la diferencia mejor de todos modos. +1 – Randolpho
Exactamente lo que estaba buscando. ¡Gracias! – sdr
@sdr: Tenga en cuenta que aquí hay una compensación de tiempo/espacio. Supongamos que no tiene tres sino veinte listas, cada una con diez mil elementos. Su método (concatenelos todos juntos en una gran lista) toma alrededor de 20 x 10K referencias adicionales y toma 20 operaciones de copia de referencia de 10K. Hacer 20 conatos ingenuos, por otro lado, no requiere referencias adicionales, pero los cónatos anidados tienen una carga de copia basada en su profundidad de anidación, por lo que habrá 10 x 11 x 10 K = 110 K de copias, no 20 K de copias. Consulte http://blogs.msdn.com/wesdyer/archive/2007/03/23/all-about-iterators.aspx para obtener más información. –