2009-10-31 8 views
25

Ich habe ein IEnumerable-Objekt. Ich würde gerne auf Basis von Index zum Beispiel zugreifen:Wie Zugriff auf Index in IEnumerable Objekt in C#?

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

Ist das möglich?

+0

@Avram Ein 'IEnumerator' ist eine ganz vernünftige Sache die wollen bekommen Index eines Artikels von. – Servy

+0

@Servy IEnumerator gepaart mit IEnumerable, IEnumerable als Teil der Frage hinzufügen müssen – Avram

+0

@Avram Nein, Sie * nicht * müssen. Es steht ihm frei, nach dem zu fragen, nach dem er fragen möchte. Er entschied sich, nach "IEnumerator" zu fragen, was eine vollkommen gute Frage ist. Nur weil es nicht die Frage ist, die Sie beantworten/beantwortet haben möchten, heißt das nicht, dass Sie diese Frage ändern sollten. – Servy

Antwort

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

sollte es nicht ich sein

+12

und auch beware, dass .ToList() erstellt eine neue Liste im Speicher. Ist das das wert? (All diese Verschwendung, nur um einen Index zu haben?) – Nestor

+2

Das ist ziemlich eklig. Also, wenn es 10.000 Produkte gibt, und er braucht den 5., sagst du ihm, dass er zuerst alle 10k in den Speicher laden soll, nur um die 9.554 zu verwerfen, die er nicht braucht? –

25

Es gibt keinen Index in IEnumerator. Verwenden Sie

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

Sie Ihren eigenen Index machen können, wenn Sie wollen:

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

Zunächst einmal sind Sie sicher, dass es wirklich IEnumerator und nicht IEnumerable? Ich vermute stark, dass es tatsächlich Letzteres ist.

Darüber hinaus ist die Frage nicht ganz klar. Haben Sie einen Index, und Sie möchten ein Objekt bei diesem Index bekommen? Wenn ja, und wenn in der Tat haben Sie eine IEnumerable (nicht IEnumerator), können Sie dies tun:

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

Wenn Sie die gesamte Sammlung aufzählen wollen, wollen aber auch für jedes Element einen Index haben, dann VA‘ s oder Nestors Antworten sind was du willst.

0

Der beste Weg, ein Element von Index abzurufen ist Ihre enumerable Sammlung mit einem Array mit Linq auf diese Weise zu verweisen:

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]; 
Verwandte Themen