我有一個由兩個項目postcode和totalCost組成的列表。我想從這個列表中獲得總成本最高的前5個項目。我曾嘗試根據最高價值從列表中獲得前5名
var top5 = list.Take(5).OrderByDescending(a => a.TotalCost);
也
var top5 = list.OrderByDescending(a=> a.TotalCost).Take(5);
這些查詢的既不產生任何變種稱爲TOP5。這個語法有什麼問題嗎?
我有一個由兩個項目postcode和totalCost組成的列表。我想從這個列表中獲得總成本最高的前5個項目。我曾嘗試根據最高價值從列表中獲得前5名
var top5 = list.Take(5).OrderByDescending(a => a.TotalCost);
也
var top5 = list.OrderByDescending(a=> a.TotalCost).Take(5);
這些查詢的既不產生任何變種稱爲TOP5。這個語法有什麼問題嗎?
var i = sums.OrderByDescending(x => x.TotalCost).Take(5).ToList();
foreach (var postCodeSum in i)
{
Console.WriteLine(postCodeSum.TotalCost);
}
編輯:沒有意識到你想要的最高值,編輯的代碼;我已經運行了代碼,它應該可以正常工作。
沒有以上。如果我將鼠標懸停在調試模式下的列表上,我可以看到列表中填充了值,但是它沒有提取任何內容給變量。 – LeedsWalker
默認OrderBy是遞增的。它將獲取前五個最低成本數據。 – Saket
謝謝,我忘了.ToList如上所述。 – LeedsWalker
提供的查詢(OrderByDescending
後跟Take()
)應該可以工作,確保類中的property/fileds是公共的。我回答的基礎上的評論
PostCodeSum類只包含私人小數_totalCost;私人字符串_postCode; - 長頸鹿4米
如果你所說的,你會在查詢中a.TotalCost
肯定得到編譯錯誤,它是私有的。如果屬性訪問意味着下面的代碼將工作:
var top5 = postCodeSumTotals.OrderByDescending(a => a.TotalCost).Take(5);
看看這個Working Example
LINQ可以使用:
.OrderByDescending(x => x.TotalCost).Take(5).ToList();
的問題是.ToList()你忘記。
通過將結果放入列表中來解決它。不知道爲什麼其他方式不起作用。
List<PostCodeSum> postCodeSumTotalsFinal = postCodeSumTotals.OrderByDescending(o => o.TotalCost).Take(5).ToList();
要回答這種情況的原因:當您使用Linq時,您的命令在調用它們時不會立即執行。 Linq生成一個'IQueryable'對象,它基本上儲存了你的命令(Select,OrderBy,...)。當你試圖訪問結果值**時,它只是**,Linq實際上將執行你的源列表中的儲存的命令。通過調用'.ToList()',你觸發了這種行爲(因爲它從元素中創建了一個列表,這意味着Linq需要知道它們是哪些元素,這意味着這些命令必須被執行)。希望這可以幫助。 – Flater
謝謝你的解釋,非常感謝。 – LeedsWalker
這個場景中'list'的類型是什麼?它是怎樣的? –
該清單已被列爲清單 postCodeSumTotals =新清單(); –
LeedsWalker
PostCodeSum類只包含私有小數_totalCost; 私人字符串_postCode; – LeedsWalker