web-dev-qa-db-fra.com

Comment accéder à l'index dans l'objet IEnumerable en C #?

J'ai un objet IEnumerable. J'aimerais accéder en fonction de l'index par exemple:

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

Est-ce possible?

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

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

De plus, la question n’est pas tout à fait claire. Avez-vous un index et vous voulez obtenir un objet à cet index? Si oui, et si vous avez une IEnumerable (pas IEnumerator), vous pouvez faire ceci:

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

Si vous souhaitez énumérer toute la collection, mais souhaitez également un index pour chaque élément, les réponses de V.A ou de Nestor sont ce que vous voulez. 

97
Pavel Minaev

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

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

vous pouvez créer votre propre index si vous voulez:

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

Le meilleur moyen de récupérer un élément par index est de référencer votre collection énumérable avec un tableau utilisant Linq de la manière suivante:

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];
0
bert