【问题标题】:C# - Select out the lowest of two values when duplicate key is foundC# - 找到重复键时选择两个值中的最小值
【发布时间】:2012-03-27 23:40:09
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: c# linq


    【解决方案1】:

    试试下面的

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

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

    【讨论】:

    • x.OrderByDescending(x => x.Percentage) 会带来最大的数字
    • @F.Aquino 谢谢。我在提交后立即发现并将其切换为OrderBy
    • 没有问题,在修复之前无法投票。我认为这是最优雅的解决方案,即使作者要求使用 linq(我知道人们会将 IEnumerable 扩展与它混淆)。
    • 所有好的答案,但这是最适合我的答案,谢谢 JaredPar
    • 你的例子有一个错误,不是 annal 但第二个 order by 有不正确的 lambda 关键字。
    【解决方案2】:
    var query = from x in list
                group x by x.Number into x
                select x.OrderBy(y => y.Percentage).First();
    

    【讨论】:

      【解决方案3】:

      这行得通吗?

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

      【讨论】:

        【解决方案4】:
          var query = (from l in lst
                 group l by l.Number into g
                 select g.Min(x => x.Percentage)).ToList();
        

        【讨论】:

          【解决方案5】:

          根据“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 语言转换中没有解决方案,要么您最终得到的解决方案不是干净的解决方案恕我直言点语法提供了这个问题。查询理解通常可以使事情变得更简单,但在这种情况下,我更喜欢点语法:

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

          gj.OrderBy(...).First() 部分完成了更多 LINQ 样式的 MinBy 操作(请参阅 Jon Skeet's post

          【讨论】:

            猜你喜欢
            • 2018-03-26
            • 2012-10-14
            • 2011-12-14
            • 1970-01-01
            • 1970-01-01
            • 2020-09-19
            • 2019-10-26
            • 2013-10-27
            • 1970-01-01
            相关资源
            最近更新 更多