2010-12-15 4 views
14

J'ai deux listesboucle foreach pour itérer deux listes

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

Maintenant, je veux itérer les éléments à la fois la liste. Je pourrais le faire en écrivant une boucle foreach pour chaque liste. Mais est-il également possible de faire quelque chose comme ça?

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

Il serait également bien si quelque chose comme ça serait possible:

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

Voulez-vous parcourir it simultanément, ou l'un puis l'autre? –

+0

Peu importe – RoflcoptrException

Répondre

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

Merci, mais si Concat n'est pas supporté par la Collection que j'utilise? – RoflcoptrException

+3

Si vous utilisez une liste et .Net version 3.5 ou supérieure, vous avez la méthode 'Concat'. Il suffit d'ajouter 'using System.Linq' –

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

Si vous voulez itérer individuellement, vous pouvez utiliser Enumerable.Concat comme cela a déjà été souligné.

Si vous souhaitez parcourir simultanément les deux listes, en ayant accès à un élément de chacune d'entre elles à l'intérieur de votre boucle, vous trouverez dans .NET 4.0 une méthode Enumerable.Zip que vous pouvez utiliser.

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); 
} 

Résultat:

 
1 one 
2 two 
3 three 
1

Ceci est une autre façon, vous pouvez le faire:

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

au lieu de' (a.Count> b.Count? A.Count: b.Count) 'vous pouvez utiliser' Math.Max ​​(a.Count, b.Count) ' – CaffGeek

0

Si vous voulez itérer simultanément sur deux listes de la même longueur (spécialement dans les scénarios comme comparer deux liste dans les tests), je pense que la boucle a plus de sens:

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