让我的头围绕Linq并享受很多乐趣!任何人都可以帮我解决这个问题:
我有一份数据清单:
Key Value Aaa 12 AaA 10 AAa 5 BBB 2 Bbb 11.我想按Key.ToUpper()分组 2.对于每一组我都需要Max(Value)& SUM(值)
Key Max Total AaA 12 27 AAa 12 27 Bbb 2 3谢谢!
更新,实际上我还需要最大条目中的密钥:
Key Max Total Correct AaA 12 27 Aaa AAa 12 27 Aaa Bbb 2 3 BBB
答案 0 :(得分:16)
:)
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
)。