2009-10-31 15 views
25

Tengo un objeto IEnumerable. Me gustaría acceder basado en el índice, por ejemplo:¿Cómo acceder al índice en el objeto IEnumerable en C#?

for(i=0; i<=Model.Products; i++) 
{ 
     ??? 
} 

¿Esto es posible?

+0

@Avram Un 'IEnumerator' es una cosa totalmente sensato que desee obtener la índice de un ítem de. – Servy

+0

@Servy IEnumerator emparejado con IEnumerable, necesita agregar IEnumerable como parte de la pregunta – Avram

+0

@Avram No, usted * no * necesita hacerlo. Él es libre de preguntar sobre el que quiere preguntar. Eligió preguntar acerca de 'IEnumerator', que es una pregunta perfecta para preguntar. El hecho de que no sea la pregunta que le gustaría responder/responder no significa que deba cambiar esta pregunta. – Servy

Respuesta

19
var myProducts = Models.Products.ToList(); 
for(i=0; i< myProducts.Count ; i++) 
{ 
     //myProducts[i]; 
} 
+0

no debería ser i

+12

y también advertir que .ToList() está creando una nueva lista en la memoria. Vale la pena (¿todo lo que desperdicia solo por tener un índice?) – Nestor

+2

Eso es bastante desagradable. Entonces, si hay 10,000 productos, y él necesita el 5to, ¿le dices primero que cargue 10k en la memoria, solo para descartar los 9,554 que no necesitará? –

25

No hay índice en IEnumerator. Utilice

foreach(var item in Model.Products) 
{ 
    ...item... 
} 

usted puede hacer su propio índice si quieres:

int i=0; 
foreach(var item in Model.Products) 
{ 
    ... item... 
    i++; 
} 
8
foreach(var indexedProduct in Model.Products.Select((p, i)=> new {Product = p, Index = i}) 
{ 
    ... 
    ...indexedProduct.Product... 
    ...indexProduct.Index ...//this is what you need. 
    ... 
} 
86

En primer lugar, ¿está seguro de que es realmente IEnumerator y no IEnumerable? Sospecho fuertemente que en realidad es el último.

Además, la pregunta no está del todo clara. ¿Tiene un índice y quiere obtener un objeto en ese índice? Si es así, y si de hecho tiene una IEnumerable (no IEnumerator), usted puede hacer esto:

using System.Linq; 
... 
var product = Model.Products.ElementAt(i); 

Si desea enumerar toda la colección, pero también quieren tener un índice para cada elemento, a continuación, VA' s o las respuestas de Nestor son lo que quieres.

0

La mejor manera de recuperar un elemento por el índice de referencia es a su colección numerable con una matriz mediante LINQ de esta manera:

using System.Linq; 
... 
class Model { 
    IEnumerable<Product> Products; 
} 
... 
// Somewhere else in your solution, 
// assume model is an instance of the Model class 
// and that Products references a concrete generic collection 
// of Product such as, for example, a List<Product>. 
... 
var item = model.Products.ToArray()[index]; 
Cuestiones relacionadas