2009-07-08 12 views
1

Existe-t-il un moyen d'itérer ValueCollection en utilisant une ligne droite? (pas pour chaque)"for loop" pour ValueCollection

par exemple.

Dictionary<string, List<long>>.ValueCollection somevalues = somecollection.Value.Values; 

for(int i = 0; i< somevalues.Count; i++) 
{ 
//now what? 
} 
+1

Pourquoi exactement ne voulez-vous pas utiliser 'foreach'? Si vous avez besoin de connaître l'index de l'élément actuel, vous pouvez simplement gérer une variable de compteur, ou utiliser la surcharge de Select mentionnée par Jon ... –

Répondre

7

Non - il n'y a pas d'indexeur ou quoi que ce soit de similaire pour ValueCollection. Je suppose que vous pouvez utiliser:

for (int i = 0; i < someValues.Count; i++) 
{ 
    var item = someValues.ElementAt(i); 
    ... 
} 

mais qui exécuterait comme un chien :)

Pourquoi voulez-vous (juste itération serait O (n^2), ce serait comme Schlemiel the Painter.) pour faire ça? Si vous voulez des éléments avec des éléments, gardez simplement un compteur ou utilisez le overload of Select that passes in the index as well as the item.

+0

Lol, gentil Jon. +1 :-) ToArray() serait plus performant que ElementAt(), mais ce serait encore une perte de temps par rapport à foreach. –

1

pas sorti de la boîte. certaines collections n'ont pas d'opérateurs d'index (myCollection[ someIndex ])

3

Vous n'avez pas ont d'utiliser un index dans une boucle for ...

for (var en = somevalues.GetEnumerator(); en.MoveNext();) 
{ 
    var item = en.Current; 
    // do something useful... 
} 
+1

N'est-ce pas juste une version moins lisible de 'foreach'? (Et il ne dispose pas non plus de l'énumérateur.) – LukeH

+0

Oui, fondamentalement, c'est exactement la même chose qu'un 'foreach' (et oui, j'ai oublié de disposer de l'énumérateur, honte à moi). Mais cela répond à la question: je n'utilise pas l'instruction 'foreach';). De toute façon, je ne vois aucune raison de ne pas utiliser 'foreach' dans ce cas ... –

1

Votre raison la plus probable de vouloir est d'être en mesure d'utiliser cet index d'une autre manière. Il suffit de coller avec une boucle foreach, d'initialiser une variable à zéro avant la boucle et de l'incrémenter au bas de la boucle.