2009-10-31 2 views
25

J'ai un objet IEnumerable. Je voudrais accéder basé sur l'index par exemple:Comment accéder à l'index dans l'objet IEnumerable en C#?

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

Est-ce possible?

+0

@Avram Un 'IEnumerator' est une chose tout à fait raisonnable de vouloir obtenir le index d'un article de. – Servy

+0

@Servy IEnumerator jumelé avec IEnumerable, besoin d'ajouter IEnumerable dans le cadre de la question – Avram

+0

@Avram Non, vous * n'avez pas besoin de. Il est libre de demander à propos de celui qu'il veut poser. Il a choisi de poser des questions sur 'IEnumerator', ce qui est une très bonne question à poser. Ce n'est pas parce que ce n'est pas la question à laquelle vous voulez répondre/que vous avez répondu que vous devriez changer cette question. – Servy

Répondre

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

ne devrait-il pas être i

+12

et aussi beaware que .ToList() est en train de créer une nouvelle liste en mémoire. Est-ce que ça en vaut la peine (tout ce gaspillage juste pour avoir un index?) – Nestor

+2

C'est assez méchant. Donc, s'il y a 10 000 produits, et qu'il a besoin du 5ème, vous lui dites de charger d'abord tous les 10k en mémoire, juste pour éliminer les 9.554 dont il n'aura pas besoin? –

25

Il n'y a pas d'index dans IEnumerator. Utilisez

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

vous pouvez faire votre propre index si vous voulez:

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

Tout d'abord, êtes-vous sûr qu'il est vraiment IEnumerator et non IEnumerable? Je soupçonne fortement que c'est en fait le dernier.

En outre, la question n'est pas entièrement claire. Avez-vous un index, et vous voulez obtenir un objet à cet index? Si oui, et si bien que vous avez un IEnumerable (non IEnumerator), vous pouvez le faire:

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

Si vous voulez énumérer toute la collection, mais veulent aussi avoir un index pour chaque élément, puis VA » s ou les réponses de Nestor sont ce que vous voulez.

0

La meilleure façon de récupérer un élément par index est de référencer votre collection dénombrable avec un tableau en utilisant Linq de cette façon:

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]; 
Questions connexes