Vb.net: индексный номер в "для каждого"

Когда-то в VB.net у меня есть что-то вроде:

For Each El in Collection
   Write(El)
Next

Но если мне нужен номер индекса, я должен изменить его на

For I = 0 To Collection.Count() - 1
   Write(I & " = " & Collection(I))
Next

Или даже (хуже)

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

Есть ли другой способ получить индекс?

Ответы

Ответ 1

Если вы используете общую коллекцию (Collection (of T)), вы можете использовать метод IndexOf.

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

Ответ 2

Я считаю, что ваш оригинальный способ сделать это с помощью счетной переменной - самый эффективный способ сделать это. Использование Linq или IndexOf убьет производительность.

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

Ответ 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.