2009-07-08 15 views
1

ストレートforループを使用してValueCollectionを反復処理する方法はありますか? (foreachではなく)"for loop" ValueCollectionの場合

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

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

なぜあなたは 'foreach'を使いたいのですか?現在の項目のインデックスを知る必要がある場合は、カウンタ変数を維持するか、Jonによって指定されたSelectのオーバーロードを使用できます。 –

答えて

7

いいえ - ValueCollectionのインデクサーなどはありません。

(それはSchlemiel the Painterようになるとしてだけ反復は、O(N^2)となります。):)あなたが望むのはなぜ

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

をそれは犬のように実行します:私はあなたが使用できると仮定しますこれをする?要素を含むアイテムが必要な場合は、カウンタをそのまま使用するか、overload of Select that passes in the index as well as the itemを使用してください。

+0

Lol、nice one Jon。 +1 :-) ToArray()はElementAt()よりもパフォーマンスが良いでしょうが、foreachに比べると時間が無駄です。 –

1

一部のコレクションにインデックス演算子がありません(myCollection[ someIndex ]

3

あなたはがためのループでインデックスを使用するを持っていない...これを望むため

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

これは 'foreach'の読みにくいバージョンではありませんか? – LukeH

+0

はい、基本的に 'foreach'と同じです(そして、はい、私は列挙子を処理するのを忘れていました、私には恥です)。しかし、私は 'foreach'命令を使用していません。とにかく、私は 'foreach'を使わない理由は見当たりません。 –

1

あなたの最も可能性が高い理由は、他の方法でそのインデックスを使用できるようにすることです。 foreachループを使うだけで、ループの前に変数をゼロに初期化し、ループの最後に変数をインクリメントします。