カウンター変数の使用には何の問題もありません。実際には、あなたが使用するかどうかfor
、foreach
while
あるいはdo
、カウンタ変数は、どこかで宣言され、インクリメントされなければなりません。
したがって、適切にインデックスが付けられたコレクションがあるかどうかわからない場合は、このイディオムを使用してください。
var i = 0;
foreach (var e in collection) {
// Do stuff with 'e' and 'i'
i++;
}
または、インデックス可能なコレクションがインデックスアクセス用のO(1)であることがわかっている場合は、これを使用します(これはおそらく(ドキュメントには記載されていません)、他のタイプ(など)では必ずしも必要ではありません)。Array
List<T>
LinkedList
// Hope the JIT compiler optimises read of the 'Count' property!
for (var i = 0; i < collection.Count; i++) {
var e = collection[i];
// Do stuff with 'e' and 'i'
}
IEnumerator
呼び出しMoveNext()
と問い合わせによって「手動」で操作する必要は決してないはずですCurrent
- foreach
その特定の煩わしさを節約しています...アイテムをスキップする必要がある場合continue
は、ループの本体でa を使用するだけです。
そして、完全を期すために、インデックスをどのように処理しているかに応じて(上記の構成は十分な柔軟性を提供します)、Parallel LINQを使用できます。
// First, filter 'e' based on 'i',
// then apply an action to remaining 'e'
collection
.AsParallel()
.Where((e,i) => /* filter with e,i */)
.ForAll(e => { /* use e, but don't modify it */ });
// Using 'e' and 'i', produce a new collection,
// where each element incorporates 'i'
collection
.AsParallel()
.Select((e, i) => new MyWrapper(e, i));
AsParallel()
すでに2014年なので、上記を使用します。これらの複数のコアをうまく活用して、処理を高速化したいと考えています。さらに、 'sequential' LINQの場合、ForEach()
拡張メソッドを取得できるのはList<T>
andArray
...だけでありforeach
、醜い構文のためにシングルスレッドを実行しているため、それを使用することがsimpleを実行するよりも優れていることは明らかではありません。