2015-10-10 28 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(); 

使用类,而不是一个整数列表的效果会更好,但它不会改变你需要做的就是排序什么结果,只有对表达式进行排序的样子。

相关问题