我在基于同一词典中整数列表中1的总和排序字典时遇到问题。首先,我想计算每个列表中的1,然后根据结果对字典进行排序。 我在Stackoverflow中找到了一些解决方案,但他们没有回答我的问题。
字典如下所示:
Dictionary<int, List<int>> myDic = new Dictionary<int, List<int>>();
List<int> myList = new List<int>();
myList = new List<int>();//Should appear third
myList.Add(0);
myList.Add(0);
myList.Add(1);
myDic.Add(0, myList);
myList = new List<int>();//Should appear second
myList.Add(1);
myList.Add(1);
myList.Add(0);
myDic.Add(1, myList);
myList = new List<int>();//Should appear first
myList.Add(1);
myList.Add(1);
myList.Add(1);
myDic.Add(2, myList);
我试过这段代码,但它似乎没有做任何事情。
List<KeyValuePair<int, List<int>>> myList2 = myDic.ToList();
myList2.Sort((firstPair, nextPair) =>
{
return firstPair.Value.Where(i=>i==1).Sum().CompareTo(nextPair.Value.Where(x=>x==1).Sum());
});
答案 0 :(得分:2)
您按升序对列表项进行排序。即超过1的项目将转到列表的末尾。你应该使用降序。只需将nextPair与firstPair进行比较(或更改比较结果的符号):
myList2.Sort((firstPair, nextPair) =>
{
return nextPair.Value.Where(i => i==1).Sum().CompareTo(
firstPair.Value.Where(x => x==1).Sum());
});
这种方法有一个问题 - 每次比较两个项目时,将计算1的总和值。更好地使用Enumerable.OrderByDescending
。它使用起来更简单,它只计算一次比较值(即键)。因此Dictionary是KeyValuePairs的可枚举,你可以直接使用OrderByDescending与字典:
var result = myDic.OrderByDescending(kvp => kvp.Value.Where(i => i == 1).Sum());
答案 1 :(得分:1)
你的排序是落后的,这就是为什么你认为它没有做任何事情。反转lambda中的firstPair / nextPair值,你将得到你期望的结果。
虽然@Sergey Berezovskiy是正确的,但您可以使用OrderBy,您的示例代码可能会受益于整体上不同的模式。
答案 2 :(得分:0)
class SummedKV
{
public KeyValuePair Kvp {get; set;}
public int Sum {get; set;}
}
var myList =
myDic.ToList()
.Select(kvp=> new SummedKV {Kvp = kvp, Sum = kvp.Value.Sum() });
myList.Sort(skv=>skv.Sum);
答案 3 :(得分:0)
也许更简单的事情
myList2.OrderByDescending(x => x.Value.Sum());
答案 4 :(得分:-2)
您的代码确实有所作为。它会创建一个以前在字典中的项目列表,并根据列表中包含的1
项目的数量进行排序。您已正确创建此列表的代码,并根据您的要求对其进行排序。 (请注意,使用OrderByDescending
可以让您更简单地执行相同的操作。)
当然,它对你拉出列表的字典没有影响。字典是无序的,因此即使您想要也不能“重新排序”这些项目。如果它是某种不同类型的有序集合,那么可能可以改变它的项目顺序,但只是创建一个新结构并订购 不会这样做;你需要对集合本身使用某种操作来改变项目的顺序。