如何通过' x'工作?

时间:2014-10-14 09:34:28

标签: c# linq collections

我最近遇到了以下代码

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”之类的集合的属性进行分组。但在上述情况下会有什么结果呢?它会是一个单独的记录,还是每个记录都在一个组中?

2 个答案:

答案 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'和该组中的所有项目进行单一分组。