2010-02-25 3 views
14

은 언젠가 VB.net에서 나는 같은 것을 가지고 내가 인덱스 번호가 필요하지만, 내가vb.net :의 인덱스 번호 "에 대한 각"

For I = 0 To Collection.Count() - 1 
    Write(I & " = " & Collection(I)) 
Next 
로 변경해야

For Each El in Collection 
    Write(El) 
Next 

심지어 (나쁜)

I = 0 
For Each El In Collection 
    Write(I & " = " & El) 
    I += 1 
Next 

인덱스를 얻기의 또 다른 방법이 있나요?

+0

나열된 옵션 중 더 나쁜 점은 무엇입니까? 의미 론적으로 덜 명확하다는 것을 당신은 발견합니까? 실적이 걱정 되십니까? –

+0

그냥 궁금해 VB는 숨겨진 색인 변수를 유지 알아요. 가장 좋은 방법은 액세스하는 것입니다. 그러나 이것을 할 방법이없는 것 같습니다. – ariel

답변

21

일반 콜렉션 (Collection of of T)을 사용하는 경우 IndexOf method을 사용할 수 있습니다.

For Each El in Collection 
    Write(Collection.IndexOf(El) & " = " & El) 
Next 
+5

이것은 꽤 낮은 성능일까요? 인덱스를 얻으려면 전체 컬렉션을 찾아야합니다. – ariel

+8

나는 성능이 무엇인지 전혀 모른다. 대부분 실적에 관심이있는 경우이를 반영하여 질문을 업데이트해야합니다. –

+5

좋아 .. 무례 할 필요는 없어. 그냥 궁금해 : – ariel

3

색인이 필요한 경우 for 루프가 가장 간단한 옵션이며 성능이 우수합니다. 앞에서 언급 한 대안과는 별도로 오버로드 된 Select 메서드를 사용하여 인덱스를 추적하고 foreach 루프를 계속 사용할 수 있습니다.

Dim list = Enumerable.Range(1, 10).Reverse() ''# sample list 
Dim query = list.Select(Function(item, index) _ 
          New With { .Index = index, .Item = item }) 
For Each obj In query 
    Console.WriteLine("Index: {0} -- Item: {1}", obj.Index, obj.Item) 
Next 

그러나 유일한 이유가 인덱스를 반복하고 인덱스를 알고있는 경우 for 루프 만 사용해야합니다. 위의 내용은 for 루프를 건너 뛰기로 선택한 이유를 분명히하지 않습니다.

5

카운터 변수를 사용하는 원래의 방식이 가장 효율적인 방법이라고 생각합니다. Linq 또는 IndexOf를 사용하면 성능이 저하됩니다.

Dim i as Integer = 0 
For Each obj In myList 
    'Do stuff 
    i+=1 
Next 
+0

동의. VB가 "For each object For myList With Index i"구문을 포함 할 때까지 기다리십시오 ;-) –

관련 문제