2017-05-18 52 views
0

我有一個由兩個項目postcode和totalCost組成的列表。我想從這個列表中獲得總成本最高的前5個項目。我曾嘗試根據最高價值從列表中獲得前5名

var top5 = list.Take(5).OrderByDescending(a => a.TotalCost); 

var top5 = list.OrderByDescending(a=> a.TotalCost).Take(5); 

這些查詢的既不產生任何變種稱爲TOP5。這個語法有什麼問題嗎?

+0

這個場景中'list'的類型是什麼?它是怎樣的? –

+0

該清單已被列爲清單 postCodeSumTotals =新清單(); – LeedsWalker

+0

PostCodeSum類只包含私有小數_totalCost; 私人字符串_postCode; – LeedsWalker

回答

1
var i = sums.OrderByDescending(x => x.TotalCost).Take(5).ToList(); 

    foreach (var postCodeSum in i) 
    { 
     Console.WriteLine(postCodeSum.TotalCost); 
    } 

編輯:沒有意識到你想要的最高值,編輯的代碼;我已經運行了代碼,它應該可以正常工作。

+0

沒有以上。如果我將鼠標懸停在調試模式下的列表上,我可以看到列表中填充了值,但是它沒有提取任何內容給變量。 – LeedsWalker

+0

默認OrderBy是遞增的。它將獲取前五個最低成本數據。 – Saket

+0

謝謝,我忘了.ToList如上所述。 – LeedsWalker

0

提供的查詢(OrderByDescending後跟Take())應該可以工作,確保類中的property/fileds是公共的。我回答的基礎上的評論

PostCodeSum類只包含私人小數_totalCost;私人字符串_postCode; - 長頸鹿4米

如果你所說的,你會在查詢中a.TotalCost肯定得到編譯錯誤,它是私有的。如果屬性訪問意味着下面的代碼將工作:

var top5 = postCodeSumTotals.OrderByDescending(a => a.TotalCost).Take(5); 

看看這個Working Example

1

LINQ可以使用:

.OrderByDescending(x => x.TotalCost).Take(5).ToList(); 

的問題是.ToList()你忘記。

0

通過將結果放入列表中來解決它。不知道爲什麼其他方式不起作用。

List<PostCodeSum> postCodeSumTotalsFinal = postCodeSumTotals.OrderByDescending(o => o.TotalCost).Take(5).ToList(); 
+0

要回答這種情況的原因:當您使用Linq時,您的命令在調用它們時不會立即執行。 Linq生成一個'IQueryable'對象,它基本上儲存了你的命令(Select,OrderBy,...)。當你試圖訪問結果值**時,它只是**,Linq實際上將執行你的源列表中的儲存的命令。通過調用'.ToList()',你觸發了這種行爲(因爲它從元素中創建了一個列表,這意味着Linq需要知道它們是哪些元素,這意味着這些命令必須被執行)。希望這可以幫助。 – Flater

+0

謝謝你的解釋,非常感謝。 – LeedsWalker