2009-10-31 12 views
25

Ho un oggetto IEnumerable. Vorrei accedere in base all'indice per esempio:Come accedere all'indice in oggetto IEnumerable in C#?

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

È possibile?

+0

@Avram Un 'IEnumerator' è una cosa del tutto ragionevole vuole ottenere il indice di un oggetto di. – Servy

+0

@Servy IEnumerator accoppiato con IEnumerable, è necessario aggiungere IEnumerable come parte della domanda – Avram

+0

@Avram No, * non * è necessario. È libero di chiedere di chi vuole chiedere. Ha scelto di chiedere "IEnumerator", che è una domanda perfettamente valida da chiedere. Solo perché non è la domanda a cui vorresti rispondere/avere risposta non significa che dovresti cambiare questa domanda. – Servy

risposta

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

non dovrebbe essere

+12

e anche beaware che .ToList() sta creando un nuovo elenco in memoria. Ne vale la pena (tutto ciò che spreca solo per avere un indice?) – Nestor

+2

Questo è piuttosto cattivo. Quindi se ci sono 10.000 prodotti e ha bisogno del quinto, gli dici di caricare prima tutti i 10k in memoria, solo per scartare i 9.554 di cui non avrà bisogno? –

25

Nessun indice in IEnumerator. Utilizzare

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

è possibile rendere il proprio indice, se si desidera:

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

Prima di tutto, sei sicuro che sia davvero IEnumerator e non IEnumerable? Sospetto fortemente che in realtà sia quest'ultimo.

Inoltre, la domanda non è del tutto chiara. Hai un indice e vuoi ottenere un oggetto in quell'indice? Se è così, e se davvero si dispone di un IEnumerable (non IEnumerator), si può fare questo:

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

Se si desidera enumerare l'intera collezione, ma vogliono anche avere un indice per ogni elemento, quindi VA' Le risposte di Nestor sono ciò che desideri.

0

Il modo migliore per recuperare un elemento in base all'indice di riferimento è la tua raccolta enumerabile con un array usando Linq in questo modo:

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]; 
Problemi correlati