2010-02-16 4 views
0

Comment puis-je récupérer les éléments d'une liste sans utiliser de boucle foreach?Comment récupérer les éléments dans la liste sans utiliser la boucle foreach en C#?

+5

Je voudrais savoir pourquoi vous ne voulez pas utiliser foreach. Cela pourrait révéler un détail qui nous aiderait à mieux répondre à votre question. –

+0

Qu'essayez-vous de faire? Pourquoi ne pouvez-vous pas utiliser foreach? Qu'en est-il de l'indexeur de liste? –

+0

J'aime récupérer en utilisant l'itérateur – ratty

Répondre

6
var list = new List<int> { 1, 2, 3, 4, 5 }; 
for (int i = 0; i < list.Count(); i++) 
{ 
    var element = list[i]; 
} 

ou

var list = new List<int> { 1, 2, 3, 4, 5 }; 
using (var enumerator = list.GetEnumerator()) 
{ 
    while (enumerator.MoveNext()) 
    { 
     var element = enumerator.Current; 
    } 
} 
+3

N'oubliez pas de disposer de l'énumérateur. –

+0

Merci - mis à jour –

1

Vous dites liste, mais vous ne spécifiez pas la classe List<T> comme this answer assumes (aussi, pourrait-on ajouter que cette réponse utilise la méthode d'extension Count(). Puisque vous connaître le type est de List<T> il est préférable d'utiliser la propriété Count ).

Si vous travaillez toujours avec l'implémentation de l'interface IList<T>, l'utilisation d'une boucle for qui itère un index puis accède à l'indexeur avec cette valeur fonctionnera correctement. Toutefois, si vous avez affaire à des implémentations IEnumerable<T>, cela ne fonctionnera pas toujours. Au contraire, vous devez faire ce qui suit:

// Get the IEnumerator<T> from the list. 
IEnumerator<T> enumerator = list.GetEnumerable(); 

// Dispose if necessary. 
using (enumerator as IDisposable) 
{ 
    // Cycle while there are items. 
    while (enumerator.MoveNext()) 
    { 
     // Work with enumerator.Current here. 
    } 
} 

Voici comment le compilateur étend l'instruction foreach lorsqu'il est compilé. Fondamentalement, puisque les implémentations IEnumerable<T> peuvent implémenter IDisposable, il se prépare à cette éventualité en essayant de convertir en IDisposable. Si ce n'est pas le cas, l'instruction using ne fait rien à la sortie. Lorsque vous utilisez foreach sur des tableaux, le compilateur développera une boucle qui accède aux éléments par index (en supposant que vous travaillez directement avec une instance de tableau), et non l'approche de l'énumérateur ci-dessus.

1

Si vous essayez d'éviter ce type de boucle:

foreach(var item in list) {}; 

... vous pouvez utiliser des expressions Linq ou Lambda pour rechercher et récupérer dans la liste.

Par exemple:

using System.Linq; 

    // ... with Lambda 
    var ints = new List<int>(){1,2,3,4,5}; 
    var evenInts = ints.ForEach(i => i % 2 == 0); 

    // with straight Linq-to-objects: 
    var oddInts = from i in ints 
     where i % 2 == 1 
     select i; 
Questions connexes