C# - 找到重复键时,选择两个值中的最小值

时间:2012-03-26 19:01:18

标签: c# linq

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

我有一个包含两个属性的List:Number和Percentage。

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

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

当找到重复的数字时,我想选择具有两个百分比值中最低值的对象,并将这些结果传输到新的列表中。

5 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:4)

尝试以下

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

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

答案 2 :(得分:3)

这会有用吗?

collection.GroupBy(item => item.Number).Select(group => group.Min())

答案 3 :(得分:1)

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

答案 4 :(得分:1)

根据" 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's post