2009-07-08 13 views
1

Gibt es eine Möglichkeit, ValueCollection mit Hilfe der direkten for-Schleife zu iterieren? (nicht foreach)"for loop" für ValueCollection

z.B.

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

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

Warum genau wollen Sie 'foreach' nicht verwenden? Wenn Sie den Index des aktuellen Elements kennen müssen, können Sie einfach eine Counter-Variable verwalten oder die von Jon erwähnte Überladung von Select verwenden. –

Antwort

7

Nein - es gibt keinen Indexer oder ähnliches für ValueCollection. Ich nehme an, Sie verwenden:

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

aber, dass wie ein Hund durchführen würde :)

Warum wollen Sie (Just würde Iteration O (n^2), da es wie Schlemiel the Painter sein würde.) um dies zu tun? Wenn Sie Elemente mit Elementen möchten, behalten Sie einfach einen Zähler oder verwenden Sie die overload of Select that passes in the index as well as the item.

+0

Lol, netter Jon. +1 :-) ToArray() wäre perfekter als ElementAt(), aber im Vergleich zur Foreach wäre es immer noch Zeitverschwendung. –

1

nicht out of the box. Einige Sammlungen haben keine Indexoperatoren (myCollection[ someIndex ])

3

Sie nicht haben einen Index in einer for-Schleife zu verwenden ...

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

Ist das nicht nur eine weniger lesbare Version von 'foreach'? (Und es hat auch keinen Enumerator.) – LukeH

+0

Ja, im Grunde ist es genau das gleiche wie eine 'foreach' (und ja, ich habe vergessen, den Enumerator zu entsorgen, Schande über mich). Aber es beantwortet die Frage: Ich benutze nicht die 'foreach' Anweisung;). Jedenfalls sehe ich keinen Grund, in diesem Fall 'foreach' nicht zu benutzen ... –

1

Ihre wahrscheinlichste Grund für den Wunsch, diese Lage sein, diesen Index auf andere Weise zu verwenden. Halten Sie sich einfach an eine foreach-Schleife, initialisieren Sie eine Variable vor der Schleife auf Null und erhöhen Sie sie am Ende der Schleife.