LINQ:从列表中选择项目(Group By/Select/Sum & Max!)

Posted

技术标签:

【中文标题】LINQ:从列表中选择项目(Group By/Select/Sum & Max!)【英文标题】:LINQ: Selecting items from a list (Group By/Select/Sum & Max!) 【发布时间】:2011-02-27 14:08:53 【问题描述】:

我只是在 Linq 周围玩得开心,玩得开心!任何人都可以帮助我查询这个: 我有一个数据列表:

核心价值 12 AA 10 AA 5 血脑屏障 2 BB 1 1. 我想按 Key.ToUpper() 分组 2. 对于每个组,我需要 Max(Value) 和 Sum(Value) 3.对于每个组我要选择条目 Value != Max(value) 最终结果应该是这样的:
    键最大值总计
    AA 12 27
    AA 12 27
    Bbb 2 3
谢谢!

更新,其实我还需要Maximum条目中的Key:

键最大总正确 AA 12 27 AA AAa 12 27 Bbb 2 3 BBB

【问题讨论】:

听起来很像家庭作业。 或者面试题...家庭作业通常不涉及“ToUpper” 两位小伙子,你会从我的个人资料中看到我的功课有点过了 :) 而不是真正的专业编码人员 [不再],只是为了好玩 :) 【参考方案1】:

:)

var results =
  from kvp in source
  group kvp by kvp.Key.ToUpper() into g
  select new
  
    Group = g,
    Max = g.Max(kvp => kvp.Value),
    Total = g.Sum(kvp => kvp.Value)
   into ag
  from x in ag.Group  //SelectMany
  where x.Value != ag.Max
    //for the update to the question - note: possibly ambiguous
  let correct = ag.Group.Where(y => y.Value == ag.Max).First().Key
  select new
  
    Key = x.Key,
    Max = ag.Max,
    Total = ag.Total,
    Correct = correct 
  ;

我有点喜欢这个问题,因为回答所需的所有小部分(有些很少使用)。


Max = g.Max(kvp => kvp.Value),
Total = g.Sum(kvp => kvp.Value)

对一个组执行多个聚合很简单,但如果您不知道如何操作,则具有挑战性。


select a into b

这个子句接受之前发生的一切,并开始一个新的目标查询。没有它,我将不得不像这样开始一个新的查询:

var A = ... select a

var B = from b in A

请务必注意,select into 子句将 kvpg 从范围中删除。


  from b in source
  from a in b.A  //SelectMany

子集合的这种“解包”将我对 b 的查询变成了对 a 的查询。与默认的 Enumerable.SelectMany 重载不同,它将父级 (b) 留在范围内。


where x.Value != ag.Max

比较孩子的财产和父母的财产?愉快。重要的是要记住在您想要过滤的任何时候打破where,即使您只是分组(没有HAVING)。

【讨论】:

Wowsers,快速回答和完美。谢谢! 很高兴我可以为 LINQ 中较少使用的部分挠痒痒。我认为添加的一点点让它变得更加棘手? 已更新。歧义来自多行可能具有相同最大值的可能性。另外我想提一下,如果给定键的所有行都具有相同的值,则不会返回任何行。

以上是关于LINQ:从列表中选择项目(Group By/Select/Sum & Max!)的主要内容,如果未能解决你的问题,请参考以下文章

LINQ Group By并将Group的子列表合并回唯一列表

2个元素(项目和数量)的列表,在Group By中获得SUM的问题

如何在linq C#中使用group by并获取记录列表[重复]

从 Linq 的列表中选择多个字段

使用 LINQ 从列表中删除特定项目

根据另一个列表中的真实条件从通用列表中选择项目