카운터 변수를 사용하는 데 아무런 문제가 없습니다. 사실, 사용 여부 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
루프의 본문에.
그리고 당신이 무엇에 따라 완전성을 위해 을 위해 인덱스 수행 한 작업 에 따라 (위의 구조는 많은 유연성을 제공합니다) 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 년이기 때문에 위를 사용하며 속도를 높이기 위해 여러 코어를 잘 사용하려고합니다. 또한 '순차적'LINQ의 경우 ForEach()
확장 방법 만 사용 List<T>
하고Array
... 더 간단한 foreach
구문을 수행하는 것보다 그 방법을 사용하는 것이 더 나쁘다는 것은 확실하지 않습니다 .