2009-11-20 60 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 – 2009-11-20 15:38:10

+0

d」哦。這當然是對的 – 2009-11-20 15:43:34

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 
    };