2008-10-15 8 views
7

estoy usando la siguiente sintaxis para recorrer una colección de listas:¿Cómo obtengo el índice de un objeto en un bucle For Each ... Next?

For Each PropertyActor As JCPropertyActor In MyProperty.PropertyActors 

    i = IndexOf(PropertyActor) 
Next 

¿Cómo puedo obtener el índice del objeto actual dentro del bucle? Estoy usando IndexOf (PropertyActor) pero parece ineficaz ya que busca en la colección cuando ya tengo el objeto disponible.

Respuesta

12

Un índice no tiene ningún significado a un IEnumerable, que es lo que usa el constructo foreach. Eso es importante porque foreach no puede enumerar en orden de índice, si su tipo de colección particular implementa IEnumerable de forma extraña. Si usted tiene un objeto que se puede acceder por el índice y se preocupa por el índice durante una iteración, entonces estás mejor simplemente utilizando un bucle for tradicional:

for (int i=0;i<MyProperty.PropertyActors.Length;i++) 
{ 
    //... 
} 
2

acaba de inicializar una variable entera antes de entrar en el bucle y repetir lo ...

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

Como Joel implicó, el bloque For Each usa la interfaz IEnumerable que no utiliza necesariamente el mismo orden que un índice. –

+0

Todavía creo que la variable 'i' le dará la respuesta correcta ... – sebagomez

1

Agregar una variable de índice que se incrementa a sí mismo para cada iteración?

+0

sí, como lo hice en el código que publiqué – sebagomez

12

AFAIK ya que esto saca el objeto de la colección, tendrá que volver a la colección para encontrarlo.

Si necesita el índice, en lugar de usar un para cada ciclo, simplemente usaría un ciclo for que pasa por los índices para que sepa lo que tiene.

+1

Este enfoque sufriría la misma desventaja, ya que las colecciones son listas y el acceso por índice es tan malo como usar indexof. Use un contador separado, puede pagar ese número entero. – tabdamage

+0

Eso puede ser, pero personalmente si necesita el índice, un bucle for tiene un sentido mucho más práctico, y no es algo que se vea fuera de lugar. –

6

Puede ser que sea más fácil de simplemente mantener un contador separado:

i = 0 
For Each PropertyActor As JCPropertyActor In MyProperty.PropertyActors 
    ... 
    i = i + 1 
Next 

Como acotación al margen, Python tiene una forma conveniente de hacer esto:

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

No entiendo por qué es esto tan diferente de lo que escribí ... obtienes +2 y obtuve -2 :( – sebagomez

+0

El índice que creas/mantienes no será necesariamente el mismo índice que la colección (porque foreach no necesariamente iterar en orden de índice). Esto también será evaluado con las respuestas erróneas similares. –

+0

Bremen: consideraría un resultado sorprendente (y no en el buen sentido). No me sorprende que no lo haga. En realidad codifica en VB. –

1

Se podría utilizar el "FindIndex" método.

MyProperty.PropertyActors.FindIndex(Function(propActor As JCPropertyActor) propActor = JCPropertyActor) 

Pero dentro de un bucle para cada uno que parece una gran cantidad de sobrecarga adicional, y parece que el mismo problema resultante como el método "IndexOf". Sugiero usar iteración de índice pasada de moda. De esta manera tienes tu índice y tu artículo.

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