2015-10-10 73 views
2

我有一個字典,其中包含字符串作爲鍵和列表值。想象一下,你有奧運會的關鍵是不同的國家和每個列表中的值是例如參加人數,體育運動的數量,金牌,銀牌等,所以如果我想通過金牌排序國家,並說金獎牌是在每個列表中的第二個條目我想是這樣的:如何使用值列表中的某個元素對Dictionary <string,List <int>>進行排序?

var countryRankings = new Dictionary<string, List<int>>(); 
countryRankings.Add(country, new List<int>() {numberOfParticipants, numberOfWins }); 
//some more country data follows 
countryRankings.OrderByDescending(pairs => pairs.Value[1]); 

最後一位不是由VisualStudio的拒絕,但無法按預期工作。字典沒有排序。當我想到它時,最好創建具有​​不同屬性的類別國家,然後按照OrderBy(c => c.goldMedals)的方式與Lambda進行排序,但是有一種方法可以嵌套在字典中列表?

+0

它是多麼接近你可以自己找到正確的答案,但是,你需要額外的一點幫助(可能是一個逗號錯過)..謝謝你:) –

回答

4

這是因爲OrderByDescending擴展方法不會改變(修改)原始對象(countryRankings),而是返回另一個對象,該對象在枚舉時會生成對原始字典中元素的有序引用。

所以,這應該工作:

var orderedRankings = countryRankings.OrderByDescending(pairs => pairs.Value[1]); 
// now you can iterate over orderedRankings 
foreach(var rankingPair in orderedRankings) 
{ 
    // do something with it.. 
} 

而且,是的,它會更好,因爲你的問題的最後一部分提出創建一個類,但不改變答案。

1

OrderByDescending方法不對字典進行排序,它返回一個新排序後的集合。

將結果賦值給一個變量。它不能是字典,因爲字典中的項目不能重新排序。您可以使用ToList方法來實現結果作爲實際徵收:

List<KeyValuePair<string, List<int>>> result = 
    countryRankings.OrderByDescending(pairs => pairs.Value[1]).ToList(); 

使用類,而不是一個整數列表的效果會更好,但它不會改變你需要做的就是排序什麼結果,只有對錶達式進行排序的樣子。

相關問題