vb.net:"for each"中的索引号

ari*_*iel 18 vb.net collections

在VB.net的某个时候我有类似的东西:

For Each El in Collection
   Write(El)
Next
Run Code Online (Sandbox Code Playgroud)

但如果我需要索引号,我必须将其更改为

For I = 0 To Collection.Count() - 1
   Write(I & " = " & Collection(I))
Next
Run Code Online (Sandbox Code Playgroud)

甚至(更糟)

I = 0
For Each El In Collection
   Write(I & " = " & El)
   I += 1
Next
Run Code Online (Sandbox Code Playgroud)

有另一种获取索引的方法吗?

Jim*_*nts 24

如果您使用的是通用集合(Collection(of T)),那么您可以使用IndexOf方法.

For Each El in Collection
   Write(Collection.IndexOf(El) & " = " & El)
Next
Run Code Online (Sandbox Code Playgroud)

  • 这不是很低的性能吗?它必须寻求整个收集来获得指数. (8认同)
  • 我不知道性能是什么.如果您对性能最感兴趣,则应更新您的问题以反映这一点. (8认同)
  • 好的..不需要粗鲁.就是想 :) (7认同)
  • 错误的假设是给定元素只会在泛型集合中出现一次. (7认同)
  • 对不起,如果我是粗鲁的,这不是我的意图.:) (6认同)
  • 如果集合包含重复项,则此方法不起作用. (3认同)

Mar*_*ngh 9

我相信你用计数器变量做这个原始方法是最有效的方法.使用Linq或IndexOf会破坏性能.

Dim i as Integer = 0
For Each obj In myList
    'Do stuff
    i+=1
Next
Run Code Online (Sandbox Code Playgroud)


Ahm*_*eed 5

如果您需要索引,那么 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
Run Code Online (Sandbox Code Playgroud)

但是,如果唯一的原因是迭代它并知道索引,我会坚持使用 for 循环。上面并没有说明为什么你选择跳过 for 循环。