Подтвердить что ты не робот

GroupBy с синтаксисом метода linq (не синтаксис запроса)

Как выглядел бы следующий запрос, если бы я использовал синтаксис метода расширения?

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 }
4b9b3361

Ответ 1

Это будет выглядеть так:

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

Ответ 2

Во-первых, основной ответ:

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 и попросить показать синтаксис С# 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 };
    });
}

Теперь, конечно, этот код можно написать немного красивее с lambdas и тому подобное, например, @mquander показал, но с Reflector, по крайней мере, вы должны понимать, как задействованы вызовы методов.

Ответ 3

Поскольку компилятор делает этот перевод для вас, запустите Reflector и посмотрите.

Ответ 4

Я знаю, что это старый вопрос, но для новых читателей посмотрите этот код gitub.

Это использование Roslyn для синтаксиса запроса и преобразования его в синтаксис метода расширения.