我有一个字典,它将字符串作为键,列表作为值。想象一下,你有奥运会的关键是不同的国家,每个名单中的价值观是参与人数,体育项目数,金牌,银牌等。所以,如果我想用金牌对国家进行排序并说金牌奖牌是每个列表中的第二个条目我想要这样的东西:
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 =&gt; 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 :(得分:1)
OrderByDescending
方法不对字典进行排序,它返回一个已排序的新集合。
将结果分配给变量。它不能是字典,因为字典中的项目不能重新排序。您可以使用ToList
方法将结果实现为实际集合:
List<KeyValuePair<string, List<int>>> result =
countryRankings.OrderByDescending(pairs => pairs.Value[1]).ToList();
使用类而不是整数列表会更好,但它不会改变你需要做的事情来获得排序结果,只改变要对它进行排序的表达式。