2010-12-15 47 views
14

tengo dos listasbucle foreach para iterar a través de dos listas

List<object> a = new List<object>(); 
List<object> b = new List<object>(); 

Ahora quiero recorrer los elementos tanto de la lista. Podría hacerlo escribiendo un ciclo foreach para cada lista. ¿Pero también es posible hacer algo así?

foreach(object o in a, b) { 
o.DoSomething(); 
} 

También sería bueno si algo así sería posible:

foreach (object o in a && b) { 
    o.DoSomething(); 
} 
+2

¿Desea iterar a través de ellos simultáneamente, o primero uno después del otro? –

+0

No importa – RoflcoptrException

Respuesta

23
foreach(object o in a.Concat(b)) { 
o.DoSomething(); 
} 
+0

Gracias, pero ¿y si Concat no es compatible con la Colección que uso? – RoflcoptrException

+3

Si usa una lista y .Net versión 3.5 o superior, tiene el método 'Concat'. Simplemente agregue 'using System.Linq' –

6
foreach(object o in a.Concat(b)) { 
o.DoSomething(); 
} 
13

Si desea iterar a través de ellos de forma individual a continuación, puede utilizar Enumerable.Concat como ya ha sido señaló.

Si desea iterar en ambas listas simultáneamente, teniendo acceso a un elemento de cada uno dentro de su ciclo, entonces en .NET 4.0 hay un método Enumerable.Zip que puede usar.

int[] numbers = { 1, 2, 3, 4 }; 
string[] words = { "one", "two", "three" }; 

var numbersAndWords = numbers.Zip(words, (first, second) => first + " " + second); 

foreach (var item in numbersAndWords) 
{ 
    Console.WriteLine(item); 
} 

Resultado:

 
1 one 
2 two 
3 three 
1

Ésta es otra manera que podía hacerlo:

for (int i = 0; i < (a.Count > b.Count ? a.Count : b.Count); i++) 
{ 
    object objA, objB; 
    if (i < a.Count) objA = a[i]; 
    if (i < b.Count) objB = b[i]; 

    // Do stuff 
} 
+1

en lugar de' (a.Count> b.Count? A.Count: b.Count) 'puede usar' Math.Max ​​(a.Count, b.Count) ' – CaffGeek

0

Si desea iterar simultáneamente a través de dos listas de la misma longitud (especialmente en los escenarios como comparar dos listas en pruebas), creo que para loop tiene más sentido:

for (int i = 0; i < list1.Count; i++) { 
    if (list1[i] == list2[i]) { 
     // Do something 
    } 
} 
Cuestiones relacionadas