使用LINQ获取第一个排序元素?(C#)

Geo*_*sen 4 .net c# linq dictionary sorted

首先,看看这段代码:

Dictionary<int,int> dict = Dictionary<int,int>();
dict[3] = 1;
dict[2] = 2;
dict[1] = 3;

foreach(KeyValuePair<int,int> item in dict.OrderByDescending(p => p.Value))
{
    print(item.Value);
    break;
}
Run Code Online (Sandbox Code Playgroud)

此代码基本上打印具有最高值的字典中的条目的值.我想在不使用"破坏" foreach循环的情况下完成此操作.我怎么能这样做?

Ani*_*Ani 10

好吧,你可以这样做:

if(dict.Any())
   print(dict.Values.Max());
Run Code Online (Sandbox Code Playgroud)

这不仅更简洁,而且不需要首先对字典进行排序(这是启动枚举的原因OrderByDescending),因此在时间和空间上都更有效.

如果您还需要密钥,则可以使用MaxBy运算符(例如来自moreLinq),如下所示:

if(dict.Any())
{
    var bestKvp = dict.MaxBy(kvp => kvp.Value);
    Console.WriteLine("Key = {0}, Value = {1}", bestKvp.Key, bestKvp.Value);
}
Run Code Online (Sandbox Code Playgroud)

可以通过操作员在O(n)时间和O(1)空间上使用标准LINQ to Objects来实现这一点Aggregate,但它非常难看:

if(dict.Any())
{
    var bestKvp = dict.Aggregate((bestSoFar, next) => bestSoFar.Value > next.Value ? bestSoFar : next );
    Console.WriteLine("Key = {0}, Value = {1}", bestKvp.Key, bestKvp.Value);
}
Run Code Online (Sandbox Code Playgroud)

  • 实际上,你所看到的很多东西都是*linq.或者,更确切地说,IEnumerable <T>接口的扩展方法 (3认同)