2010-02-25 23 views
14

En algún momento de VB.net que tengo algo así como:vb.net: número de índice en "para cada"

For Each El in Collection 
    Write(El) 
Next 

Pero si necesito el número de índice, que tengo que cambiarlo a

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

O incluso (peor)

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

¿hay otra manera de conseguir el índice?

+0

¿Qué es lo peor de las opciones que lista? ¿Los encuentras semánticamente menos claros? ¿Estás preocupado por el rendimiento? –

+0

solo me pregunto, porque sé que VB mantiene una variable de índice oculta. la mejor opción sería acceder a ella. pero parece que no hay forma de hacer esto. – ariel

Respuesta

21

Si está utilizando una colección genérica (Colección (de T)) entonces puede usar el IndexOf method.

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

¿No sería esto de un rendimiento bastante bajo? Tiene que buscar toda la colección para obtener el índice. – ariel

+8

No tengo idea de cuál es el rendimiento. Si está interesado principalmente en el rendimiento, debe actualizar su pregunta para reflejar eso. –

+5

bien ... no hay necesidad de ser grosero. solo me pregunto :) – ariel

3

Si necesita el índice, un bucle for es la opción más sencilla y tiene un gran rendimiento Además de las alternativas que mencionó, puede usar el método Select sobrecargado para realizar un seguimiento de los índices y continuar utilizando el ciclo 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 

Sin embargo, me quedaría con el bucle for si el único motivo es iterar sobre él y conocer el índice. Lo anterior no aclara por qué eligió omitir el ciclo for.

5

Creo que su forma original de hacerlo con una variable de contador es la forma más eficiente de hacerlo. Usar Linq o IndexOf mataría el rendimiento.

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

De acuerdo. Espere hasta que VB incluya un constructo "For Each object In myList With Index i" ;-) –

Cuestiones relacionadas