2011-10-14 2 views
8

C'è un buon modo per fornire una colonna di indice "incremento automatico" stile (da 1..x) quando si proiettano oggetti utilizzando LINQ?incremento automatico un elenco generico utilizzando LINQ in C#

Come esempio di base, sto cercando la colonna di indice qui sotto per andare da 1 al numero di elementi nella lista.

Scorrere l'elenco sarebbe l'opzione facile ma mi chiedevo se c'era un modo migliore per farlo?

+0

In generale, è possibile generare un nuovo incremento enumerabile utilizzando l'Enumerable.Range (1, numOfItems), ma nel tuo caso, utilizza il Select sovraccarico è l'opzione migliore per le vostre esigenze. –

risposta

13

Non si può fare questo con le espressioni LINQ. È possibile utilizzare il seguente metodo .Select estensione però:

var items = list.Select((x, index) => new BrowsingSessionItemModel { 
    Id = x.Id, 
    Index = index 
}); 
+0

Grazie per la risposta. – Nick

+0

Quale sarebbe il modo più efficiente per iniziare da 1, anziché da 0? – Nick

+2

'Indice = indice + 1'. –

7

È possibile utilizzare il overload of Select che batte fornisce l'indice di proiezione nonché:

var items = list.Select((value, index) => new BrowsingSessionItemModel { 
               Id = value.Id, 
               Index = index 
              }); 

noti che non v'è alcun supporto di query per questo sovraccarico. Se si sta effettivamente andare a prendere i valori da un database (non è chiaro se list è davvero un List<T>) probabilmente si dovrebbe assicurarsi di avere un ordinamento adeguato, altrimenti i risultati sono un po 'arbitraria.