Как получить доступ к индексу в IEnumerable объекте в C #? - PullRequest
27 голосов
/ 31 октября 2009

У меня есть объект IEnumerable. Я хотел бы получить доступ на основе индекса, например:

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

Возможно ли это?

Ответы [ 5 ]

104 голосов
/ 17 ноября 2009

Прежде всего, вы уверены, что это действительно IEnumerator, а не IEnumerable? Я сильно подозреваю, что на самом деле это последнее.

Кроме того, вопрос не совсем ясен. У вас есть индекс, и вы хотите получить объект по этому индексу? Если это так, и если у вас действительно есть IEnumerable (не IEnumerator), вы можете сделать это:

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

Если вы хотите перечислить всю коллекцию, но также хотите иметь индекс для каждого элемента, то ответы В.А. или Нестора - это то, что вам нужно.

26 голосов
/ 31 октября 2009

В IEnumerator нет индекса. Используйте

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

Вы можете сделать свой собственный индекс, если хотите:

int i=0;
foreach(var item in Model.Products)
{
    ... item...
    i++;
}
21 голосов
/ 31 октября 2009
var myProducts = Models.Products.ToList();
for(i=0; i< myProducts.Count ; i++)
{
      //myProducts[i];
}
8 голосов
/ 17 ноября 2009
foreach(var indexedProduct in Model.Products.Select((p, i)=> new {Product = p, Index = i})
{
   ...
   ...indexedProduct.Product...
   ...indexProduct.Index ...//this is what you need.
   ...
}
0 голосов
/ 12 июля 2017

Лучший способ получить элемент по индексу - сослаться на вашу перечисляемую коллекцию с массивом, используя Linq, следующим образом:

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];
...