ストレート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?
}
ストレート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?
}
いいえ - 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を使用してください。
Lol、nice one Jon。 +1 :-) ToArray()はElementAt()よりもパフォーマンスが良いでしょうが、foreachに比べると時間が無駄です。 –
一部のコレクションにインデックス演算子がありません(myCollection[ someIndex ]
)
あなたはがためのループでインデックスを使用するを持っていない...これを望むため
for (var en = somevalues.GetEnumerator(); en.MoveNext();)
{
var item = en.Current;
// do something useful...
}
これは 'foreach'の読みにくいバージョンではありませんか? – LukeH
はい、基本的に 'foreach'と同じです(そして、はい、私は列挙子を処理するのを忘れていました、私には恥です)。しかし、私は 'foreach'命令を使用していません。とにかく、私は 'foreach'を使わない理由は見当たりません。 –
あなたの最も可能性が高い理由は、他の方法でそのインデックスを使用できるようにすることです。 foreachループを使うだけで、ループの前に変数をゼロに初期化し、ループの最後に変数をインクリメントします。
なぜあなたは 'foreach'を使いたいのですか?現在の項目のインデックスを知る必要がある場合は、カウンタ変数を維持するか、Jonによって指定されたSelectのオーバーロードを使用できます。 –