【问题标题】:LINQ: Selecting items from a list (Group By/Select/Sum & Max!)LINQ:从列表中选择项目(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”
  • 两位小伙子,你会从我的个人资料中看到我的功课有点过了 :) 而不是真正的专业编码人员 [不再],只是为了好玩 :)

标签: c# linq select group-by


【解决方案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 中较少使用的部分挠痒痒。我认为添加的一点点让它变得更加棘手?
  • 已更新。歧义来自多行可能具有相同最大值的可能性。另外我想提一下,如果给定键的所有行都具有相同的值,则不会返回任何行。
猜你喜欢
  • 2015-11-11
  • 2012-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-29
相关资源
最近更新 更多