使用linq方法语法(而不是查询语法)进行GroupBy

20

如果我使用扩展方法语法,以下查询将如何呈现?

var query = from c in checks
group c by string.Format("{0} - {1}", c.CustomerId, c.CustomerName) 
into customerGroups
select new { Customer = customerGroups.Key, Payments = customerGroups }

1
供您日后参考,这个问题在C# 3.0规范中有详细解答,您可以从互联网上下载。所有的查询转换规则都在那里被明确指定。 - Eric Lippert
谢谢,我不知道转换规则已经有文档记录了。 - Dane O'Connor
4个回答

26

它看起来像这样:

var query = checks
    .GroupBy(c => string.Format("{0} - {1}", c.CustomerId, c.CustomerName))
    .Select (g => new { Customer = g.Key, Payments = g });

8

首先,基本答案:

var query = checks.GroupBy<Customer, string>(delegate (Customer c) {
    return string.Format("{0} - {1}", c.CustomerId, c.CustomerName);
}).Select(delegate (IGrouping<string, Customer> customerGroups) {
    return new { Customer = customerGroups.Key, Payments = customerGroups };
});

那么,你如何自行解决这些问题呢?

首先,从这里下载并安装Reflector。

然后构建一个示例程序,比如一个小型控制台程序,其中包含你想要分析的代码。以下是我编写的代码:

using System;
using System.Collections.Generic;
using System.Linq;

namespace ConsoleApplication11
{
    public class Customer
    {
        public Int32 CustomerId;
        public Int32 CustomerName;
    }

    class Program
    {
        static void Main(string[] args)
        {
            var checks = new List<Customer>();
            var query = from c in checks
                        group c by String.Format("{0} - {1}", c.CustomerId, c.CustomerName)
                            into customerGroups
                            select new { Customer = customerGroups.Key, Payments = customerGroups };
        }
    }
}

然后您构建它,打开反编译器,并要求它打开相关的 .exe 文件。

然后您导航到相关的方法,对我来说是 ConsoleApplication11.Program.Main

这里的技巧是进入 Reflector 的选项页面,并要求它显示 C# 2.0 语法,这将使用适当的静态方法调用替换 Linq。这样做会给我以下代码:

private static void Main(string[] args)
{
    List<Customer> checks = new List<Customer>();
    var query = checks.GroupBy<Customer, string>(delegate (Customer c) {
        return string.Format("{0} - {1}", c.CustomerId, c.CustomerName);
    }).Select(delegate (IGrouping<string, Customer> customerGroups) {
        return new { Customer = customerGroups.Key, Payments = customerGroups };
    });
}

当然,这段代码可以使用lambda和类似的方法写得更加优美,就像@mquander 展示的那样,但至少通过Reflector,你应该能够理解涉及的方法调用。

ReSharper 还具有查询语法的转换。 - bzlm

2

由于编译器会为您完成此翻译,请启动Reflector并查看。


1
我知道这是一个旧问题,但对于新读者,请查看此github代码。
这使用Roslyn将查询语法转换为扩展方法语法。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接