排序列表中最长的列表

时间:2014-02-03 15:28:17

标签: c# linq sortedlist

我有一个列表的SortedList,我有兴趣找到与最长列表相对应的KEY(列表中包含最多的项目)。在代码中,它看起来像:

// how the list is defined:
var myList = new SortedList<long, List<string>>();

// EXAMPLE data only:
myList.Add(0, new List<string>());
myList[0].AddRange(new []{"a", "b", "c"});

myList.Add(8, new List<string>());
myList[8].AddRange(new []{"1", "2"});

myList.Add(23, new List<string>());
myList[23].AddRange(new []{"c", "d", "e", "f", "g"});

在上面的示例中,结果应为“23”,因为这是与最长列表一起使用的键。

我知道如何使用for循环编写它,但我认为这应该是一个简单的LINQ操作。也就是说,我似乎无法获得完全正确的语法!任何帮助表示赞赏!

4 个答案:

答案 0 :(得分:7)

可能有一种更有效的方式,但您可以按计数(值)降序排序,然后先取。

myList.OrderByDescending(m => m.Value.Count()).First().Key;

当然,如果你想要所有具有最高计数的密钥(它们可能是具有相同长度的多个值),你应该按计数进行分组。

类似的东西。

myList.GroupBy(m => m.Value.Count())
      .OrderByDescending(m => m.Key)//I'm the key of the group by
      .First()
      .Select(g => g.Key);//I'm the key of the SortedList

因此,如果您向样本添加具有相同列表长度的项目

myList.Add(24, new List<string>());
myList[24].AddRange(new[] {"a", "b", "c", "d", "e"});

你会得到23和24。

可以用

实现
from item in myList
let maxCount = myList.Max(x => x.Value.Count())
where item.Value.Count() == maxCount
select item.Key;

答案 1 :(得分:3)

虽然排序会给你正确的结果,但它需要执行O(n log n)时间,而渐近地高于简单的O(n)扫描:

int maxLength = myList.Max(x => x.Value.Count);
var longestKeys = myList.Where(x => x.Value.Count == maxLength).Select(x => x.Key);

答案 2 :(得分:3)

使用more MaxBy morelinq

var key = myList.MaxBy(x => x.Value.Count()).Key;

答案 3 :(得分:0)

只是为了添加另一种方法,你可以使用Linq的Aggregate方法实现这一点:

//Extension method
public static long MaxIndex(this SortedList<long, List<string>> list)
{
    return list.Aggregate(
        new { MaxValue = -1, Key = -1L },
            ((agg, current) => (current.Value.Count.CompareTo(agg.MaxValue) > 0 || agg.Key == -1) ?
        new { MaxValue = current.Value.Count, Key = current.Key } :
        new { MaxValue = agg.MaxValue, Key = agg.Key })).
        Key;
}

// how the list is defined:
var myList = new SortedList<long, List<string>>();

// EXAMPLE data only:
myList.Add(0, new List<string>());
myList[0].AddRange(new[] { "a", "b", "c" });

myList.Add(8, new List<string>());
myList[8].AddRange(new[] { "1", "2" });

myList.Add(23, new List<string>());
myList[23].AddRange(new[] { "c", "d", "e", "f", "g" });

var idx = myList.MaxIndex();

这可以从这个SO答案改编而来:https://stackoverflow.com/a/15068695/172769

干杯