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
子句将 kvp
和 g
从范围中删除。
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的问题