web-dev-qa-db-ja.com

C#のIEnumerableオブジェクトのインデックスにアクセスする方法は?

IEnumerableオブジェクトがあります。たとえば、インデックスに基づいてアクセスしたい:

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

これは可能ですか?

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

まず、本当にIEnumeratorではなくIEnumerableであると確信していますか?私はそれが実際に後者であると強く疑います。

さらに、問題は完全に明確ではありません。インデックスがあり、そのインデックスでオブジェクトを取得したいですか?もしそうなら、そして実際にIEnumerableIEnumeratorではない)を持っているなら、これを行うことができます:

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

コレクション全体を列挙したいが、各要素にインデックスを付けたい場合は、V.A。またはNestorの答えが必要です。

109
Pavel Minaev

IEnumeratorにはインデックスがありません。使用する

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

必要に応じて、独自のインデックスを作成できます。

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.
   ...
}
9
V.A.

インデックスでアイテムを取得する最良の方法は、次のように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];
0
bert