2009-10-31 19 views
25

私はIEnumerableオブジェクトを持っています。たとえばインデックスに基づいてアクセスしたいと考えています。C#でIEnumerableオブジェクトのインデックスにアクセスするには?

これは可能ですか?

+0

@Avramアン 'IEnumerator'を取得したいために、完全に賢明なことですのアイテムのインデックス。 – Servy

+0

@Servy IEnumeratorとIEnumerableを組み合わせて、質問の一部としてIEnumerableを追加する必要があります。 – Avram

+0

@Avramいいえ、あなたは*必要ありません。彼は聞いてみたいことについて自由に聞いています。彼は 'IEnumerator'について尋ねることを選んでいます。これは完全に良い質問です。あなたが答えたい/答えた質問ではないからといって、この質問を変えるべきではありません。 – Servy

答えて

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

私は

+12

であるべきではなく、また.ToList()がメモリ内に新しいリストを作成していることに注意してください。それは価値があるのですか?(インデックスを持つだけの無駄なものはどれですか?) – Nestor

+2

それはかなり厄介です。だから1万の製品があり、5番目が必要な場合は、最初に10kをすべてメモリにロードし、必要のない9,554を破棄するように指示します。 –

25

IEnumeratorにはインデックスがありません。すべての

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

まず、あなたはそれが本当にIEnumeratorなくIEnumerableだと確信している、:あなたがしたい場合

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

は、あなたがあなた自身のインデックスを作ることができます使用しますか?私はそれが実際に後者であることを強く疑う。

さらに、問題は完全には明らかではありません。あなたはインデックスを持っていますか?そのインデックスでオブジェクトを取得したいですか?もしそうなら、あなたはIEnumerable(ないIEnumerator)、あなたがこれを行うことができます持っている確かにあれば:あなたは、コレクション全体を列挙したい場合

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

をするだけでなく、各要素のインデックスを持ちたい、その後、VA」ネストールの答えはあなたが望むものです。

0

インデックスでアイテムを取得するための最良の方法は、このように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]; 
関連する問題