Vb.net 如何在For Each…Next循环中获取对象的索引?

Vb.net 如何在For Each…Next循环中获取对象的索引?,vb.net,Vb.net,我使用以下语法循环遍历列表集合: For Each PropertyActor As JCPropertyActor In MyProperty.PropertyActors i = IndexOf(PropertyActor) Next 如何获取循环中当前对象的索引?我正在使用IndexOf(PropertyActor),但这似乎效率低下,因为它在我已经有对象可用时搜索集合 只需在进入循环之前初始化一个整数变量并对其进行迭代 Dim i as Integer For Each P

我使用以下语法循环遍历列表集合:

For Each PropertyActor As JCPropertyActor In MyProperty.PropertyActors

    i = IndexOf(PropertyActor)
Next

如何获取循环中当前对象的索引?我正在使用IndexOf(PropertyActor),但这似乎效率低下,因为它在我已经有对象可用时搜索集合

只需在进入循环之前初始化一个整数变量并对其进行迭代

Dim i as Integer 
For Each PropertyActor As JCPropertyActor In MyProperty.PropertyActors
    i++
Next

添加一个索引变量,您可以为每次迭代增加该变量?

AFAIK因为这会将对象从集合中拉出,所以您必须返回集合才能找到它


如果您需要索引,而不是使用for-each循环,我只会使用for循环遍历索引,这样您就知道自己拥有什么了。

可能最简单的方法是只保留一个单独的计数器:

i = 0
For Each PropertyActor As JCPropertyActor In MyProperty.PropertyActors
    ...
    i = i + 1
Next
另一方面,Python有一种方便的方法:

for i, x in enumerate(a):
    print "object at index ", i, " is ", x

索引对IEnumerable没有任何意义,这正是foreach构造所使用的。这很重要,因为如果您的特定集合类型以奇数方式实现IEnumerable,则
foreach
可能不会按索引顺序枚举。如果您有一个可以通过索引访问的对象,并且您在迭代过程中关心索引,那么您最好只使用传统的for循环:

for (int i=0;i<MyProperty.PropertyActors.Length;i++)
{
    //...
}
对于(inti=0;i您可以使用“FindIndex”方法

但是在for-each循环中,似乎有很多额外的开销,并且似乎与“IndexOf”方法产生的问题相同。我建议使用老式的索引迭代。这样你就有了索引和项目

Dim PropertyActor As JCPropertyActor
For i As Integer = 0 To MyProperty.PropertyActors.Count - 1
    PropertyActor = MyProperty.PropertyActors.Item(i)
Next

正如Joel所暗示的,For-Each块使用IEnumerable接口,该接口不一定使用与索引相同的顺序。这种方法会遇到相同的缺点,因为集合是哈希列表,按索引访问与使用indexof一样糟糕。使用单独的计数器,您可以承受该整数。这可能是,但如果您需要in,就个人而言dex,一个for循环更具实际意义,而且不会看起来不合适。我不明白为什么这与我写的东西有这么大的不同……你得到+2,我得到-2:(你创建/维护的索引不一定是集合拥有的相同索引(因为foreach不一定按索引顺序迭代)这可能也会被其他类似的错误答案所压倒。不来梅:我会认为这是一个令人惊讶的结果(而不是一个好方法)。怪不得我没有在VB中真正编码。
Dim PropertyActor As JCPropertyActor
For i As Integer = 0 To MyProperty.PropertyActors.Count - 1
    PropertyActor = MyProperty.PropertyActors.Item(i)
Next