2009-11-20 6 views
8

В моем приложении у меня есть список элементов, которые мне нужно отсортировать по цене и установить индекс ранга/позиции для каждого элемента. Мне нужно сохранить звание, потому что после этого цена может измениться. В настоящий момент я делаю так:Задайте значения с помощью 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++; 
    } 
} 

Есть ли более короткий способ сделать это?

ответ

9

Возможно ли это?

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

Это будет, за исключением одной маленькой детали ... нумерация начнется с 2. Вам нужно изменить приращение к постфиксу (rankPosition ++) или начальному значению rankPosition 0. –

+0

д» ой. это, конечно, правильно –

1

Самых простых из них будет

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

Конечно, вы можете написать свое собственное расширение ForEach для IEnumerable, но я помню, что я имел побочный эффект с ним. Лучше работать с List.

3

Вы можете сделать это, используя ключевое слово let. Это должно работать ...

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 
    }; 
Смежные вопросы