2009-11-20 14 views
8

En mi aplicación tengo una lista de artículos que debo ordenar por precio y establecer un índice de rango/posición para cada artículo. Necesito almacenar el rango porque el precio puede cambiar después. Por el momento lo estoy haciendo así:¿Establecer valores con un Linq-Query?

var sortedlistKFZ = from res in listKFZ orderby res.Price select res; 
if (sortedlistKFZ.Any()) 
{ 
    int rankPosition = 1; 
    foreach (Result kfz in sortedlistKFZ) 
    { 
      kfz.MesaAdvertNumber = rankPosition; 
      rankPosition++; 
    } 
} 

¿Hay una manera más corta de hacerlo?

Respuesta

9

¿Podrías usar este tono?

int rankPosition = 1; 
var sortedListKFZ = listKFZ.OrderBy(r => r.Price).Select(r => { 
    r.MesaAdvertNumber = ++rankPosition; 
    return r; 
}); 
+2

Será, excepto por un pequeño detalle ... la numeración se iniciará desde 2. Es necesario un cambio de incremento de postfix (rankPosition ++) o el valor inicial de rankPosition a 0. –

+0

d' Oh. eso es correcto, por supuesto –

1

La más simple sería

(from res in listKFZ orderby res.Price select res).ToList().ForEach(...) 

Por supuesto, usted puede escribir su propia extensión para ParaCada IEnumerable, pero recuerdo que tenía de efectos secundarios con él. Es mejor operar en List.

3

Puede hacerlo utilizando la palabra clave let. Esto debería funcionar ...

Int32[] numbers = new Int32[] { 3, 6, 4, 7, 2, 8, 9, 1, 2, 9, 4 }; 

int count = 1; 
var ranked = 
    from n in numbers 
    let x = count++ 
    select new { 
     Rank = x, 
     Number = n 
    }; 
Cuestiones relacionadas