排序列表中最长的列表

dre*_*w_w 4 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"});
Run Code Online (Sandbox Code Playgroud)

在上面的例子中,结果应为"23",因为这是最长列表的关键.

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

Rap*_*aus 7

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

myList.OrderByDescending(m => m.Value.Count()).First().Key;
Run Code Online (Sandbox Code Playgroud)

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

这样的事情.

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
Run Code Online (Sandbox Code Playgroud)

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

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

你会得到23和24.

同样可以实现

from item in myList
let maxCount = myList.Max(x => x.Value.Count())
where item.Value.Count() == maxCount
select item.Key;
Run Code Online (Sandbox Code Playgroud)


Dou*_*las 5

虽然排序会给出正确的结果,但它需要 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);
Run Code Online (Sandbox Code Playgroud)