根据整数列表中的值对字典进行排序

时间:2014-07-31 19:40:08

标签: c# linq

我在基于同一词典中整数列表中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());
});

5 个答案:

答案 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可以让您更简单地执行相同的操作。)

当然,它对你拉出列表的字典没有影响。字典是无序的,因此即使您想要也不能“重新排序”这些项目。如果它是某种不同类型的有序集合,那么可能可以改变它的项目顺序,但只是创建一个新结构并订购 不会这样做;你需要对集合本身使用某种操作来改变项目的顺序。