C#-当发现重复密钥时,从两个值中选择最低值

本文关键字:两个 最低值 选择 发现 密钥 C#- | 更新日期: 2023-09-27 18:29:01

使用Linq执行此操作的最佳方法是什么?

我有一个包含两个属性的列表:数字和百分比。

有时列表中有重复的数字:

 -----------------------------
 Number: 182 | Percentage: 15%
 Number: 182 | Percentage: 70%
 ...

当发现重复的数字时,我想选择两个百分比值中最低的对象,并将这些结果转移到新的列表中。

C#-当发现重复密钥时,从两个值中选择最低值

尝试以下

var list = originalList
    .GroupBy(x => x.Number)
    .Select(x => x.OrderBy(y => y.Percentage).First())
    .ToList();

此查询将首先按Number值对项目进行分组。然后,它将按百分比对每组进行排序,并选择第一个元素(最低的)。

var query = from x in list
            group x by x.Number into x
            select x.OrderBy(y => y.Percentage).First();

这样行吗?

collection.GroupBy(item => item.Number).Select(group => group.Min())
  var query = (from l in lst
         group l by l.Number into g
         select g.Min(x => x.Percentage)).ToList();

根据"LINQ"发布者希望查询理解语法而不是点语法的解释进行更改(否则其他响应就足够了):

var query =
    from i in list
    group i by i.Number into gj
    select gj.OrderBy(x => x.Percentage).First();

但这仍然使用了很多点语法进行排序。其功能等效于:

var query =
    from i in list
    group i by i.Number into gj
    select 
        (from i in gj
        orderby i.Percentage
        select i).First();

如果你不喜欢.First()调用,那么这将是一个挑战,要么在LINQ语言转换中没有解决方案,要么你最终得到的解决方案将不是IMHO点语法为这个问题提供的干净的解决方案。查询理解通常可以使事情变得更简单,但在这种情况下,我更喜欢点语法:

var query =
    list.GroupBy(i => i.Number)
        .Select(gj => gj.OrderBy(i => i.Percentage).First());

gj.OrderBy(...).First()部分完成了更LINQ风格的MinBy操作(请参阅Jon Skeet的文章)