2011-10-14 20 views
8

¿Existe una buena manera de proporcionar una columna de índice de estilo de "incremento automático" (desde 1..x) al proyectar elementos utilizando LINQ?Aumento automático de una lista genérica utilizando LINQ en C#

Como ejemplo básico, estoy buscando la columna de índice a continuación para pasar de 1 a la cantidad de elementos en la lista.

var items = from s1 in list 
    select new BrowsingSessionItemModel { Id = s1.Id, Index = 0 }; 

iteración a través de la lista sería la opción más fácil, pero me preguntaba si había una mejor manera de hacer esto?

+0

En general, puede generar un nuevo enumerable de incremento usando el Enumerable.Range (1, numOfItems), pero en su caso, usar la sobrecarga Select es la mejor opción para sus necesidades. –

Respuesta

13

No puede hacer esto con expresiones LINQ. Se podría utilizar el siguiente método .Select extensión embargo:

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

Gracias por la respuesta. – Nick

+0

¿Cuál sería la forma más eficiente de comenzar desde 1 en lugar de 0? – Nick

+2

'Índice = índice + 1'. –

7

Puede utilizar el overload of Select que toma la proporciona el índice de la proyección, así:

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

Tenga en cuenta que no hay soporte expresión de consulta para esta sobrecarga Si en realidad está obteniendo los valores de una base de datos (no está claro si list es realmente un List<T>) probablemente debería asegurarse de tener un pedido adecuado, ya que de lo contrario los resultados son algo arbitrarios.

Cuestiones relacionadas