我最近遇到了以下代码
from item in collection
group item by 'x' into itemGroup
select new
{
Amount = itemGroup.Sum(z => z.Amount),
PrevAmount = itemGroup.Sum(x => x.PrevAmount)
}
通常我们按照“group by item.Type”之类的集合的属性进行分组。但在上述情况下会有什么结果呢?它会是一个单独的记录,还是每个记录都在一个组中?
答案 0 :(得分:2)
假设您的收藏包含以下对象:
{x=1; z=10}
{x=1; z=20}
{x=2; z=30}
{x=3; z=40}
{x=3; z=50}
执行group
之后,您将获得3个项目的枚举。
每个项目(类型IGrouping<T>
)都是可枚举的,如下所示:
[{x=1; z=10}, {x=1; z=20}]
[{x=2; z=30}]
[{x=3; z=40}, {x=3; z=50}]
之后,对于此枚举的每个元素,您将创建一个新对象(包含select new
的行),其中包含组中每个子项的“x”-es和“z”-s的总和。
[{x=1; z=10}, {x=1; z=20}] -> {Amount=10+20; PrevAmount=1+1}
[{x=2; z=30}] -> {Amount=30; PrevAmount=2}
[{x=3; z=40}, {x=3; z=50}] -> {Amount=40+50; PrevAmount=3+3}
所以你的结果是:
{Amount=30; PrevAmount=2}
{Amount=30; PrevAmount=2}
{Amount=90; PrevAmount=6}
我理解您的代码将如何运作。
答案 1 :(得分:1)
如果您将查看用方法语法编写的查询(实际上所有查询语法查询都编译为方法语法查询),则更容易看到发生了什么。因此,您的查询与
相同collection.GroupBy(item => 'x')
和一些投影(选择运算符),这里没关系。那么,item => 'x'
是什么?它是一个组密钥选择器。即您将每个项目传递给此匿名方法,并计算密钥。此键用于确定当前项目应该去哪个组。通常您应该根据项目的值计算密钥。与item => item.Type
类似,但在这种情况下,您只需返回常量值。因此,对于所有项目计算的键值将是相同的。您将使用密钥'x'
和该组中的所有项目进行单一分组。