GroupBy в лямбда-выражениях - PullRequest
22 голосов
/ 23 июня 2010
from x in myCollection
    group x by x.Id into y
    select new { 
       Id = y.Key, 
       Quantity = y.Sum(x => x.Quantity)
    };

Как бы вы написали вышеприведенное как лямбда-выражение?Я застрял на group into части.

Ответы [ 5 ]

48 голосов
/ 23 июня 2010

Продолжения запроса (выберите ... в и сгруппируйте ... в, но не объедините ... в) эквивалентны простому разбиению выражения запроса.Поэтому мне нравится думать о вашем примере как:

var tmp = from x in myCollection
          group x by x.Id;
var result = from y in tmp
             select new { 
               Id = y.Key, 
               Quantity = y.Sum(x => x.Quantity)
             };

Измените их на точечные обозначения:

var tmp = myCollection.GroupBy(x => x.Id);
var result = tmp.Select(y => new { 
               Id = y.Key, 
               Quantity = y.Sum(x => x.Quantity)
             });

Затем вы можете объединить их обратно:

var tmp = myCollection.GroupBy(x => x.Id)
                      .Select(y => new { 
                                Id = y.Key, 
                                Quantity = y.Sum(x => x.Quantity)
                              });

Как только вы выясните, что компилятор C # делает с выражениями запросов, остальное относительно просто:)

8 голосов
/ 23 июня 2010
myCollection.GroupBy(x => x.Id)
            .Select(y => new {
                                 Id = y.Key,
                                 Quantity = y.Sum(x => x.Quantity)
                             });
6 голосов
/ 23 июня 2010
myCollection
    .GroupBy(x => x.Id)
    .Select(x => 
        new 
        { 
          Id = x.Key, 
          Quantity = x.Sum(y => x.Quantity
        });
1 голос
/ 07 февраля 2016
        var mostFrequent =
            lstIn.Where(i => !string.IsNullOrEmpty(i))
                 .GroupBy(s => s)
                 .OrderByDescending(g => g.Count())
                 .Select(s => s.Key)
                 .FirstOrDefault();
0 голосов
/ 27 февраля 2018

Итак, для большинства ответов здесь все, кажется, имеют дело с получением простого объекта Id, созданного из счетчика группы, и самого ключа, который является group.Key.

Хотя это, вероятно,основное использование этого.На самом деле не удовлетворяли мои потребности.

В моем случае я хотел группировать по некоторому свойству объекта, а затем извлекать конкретный объект из этой группы.Вот пример кода.

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

public class Program
{
    public static void Main()
    {
        Console.WriteLine("Hello World");
        var response = new List<ResponseClass>();
            var listOfStudents = new List<Student>();
            // Insert some objects into listOfStudents object.
            listOfStudents.GroupBy(g => g.Class).ToList()
                .ForEach(g => response.Add(g.OrderByDescending(s => s.CreatedOn).Select(a =>
                new ResponseClass
                {
                    SName = a.StudentName,
                    SAge = a.Age,
                    SClass = a.Class,
                    SCreatedOn = a.CreatedOn,
                    RandomProperty = Guid.NewGuid().ToString()
                })
                .First()));

                Console.WriteLine("This compiles and should work just fine");
    }
    class Student
    {
        public string StudentName { get; set; }
        public int Age { get; set; }
        public string Class { get; set; }
        public DateTime CreatedOn { get; set; }
    }

    class ResponseClass
    {
        public string SName { get; set; }
        public int SAge { get; set; }
        public string SClass { get; set; }
        public DateTime SCreatedOn { get; set; }
        public string RandomProperty { get; set; }
    }
}

Если вы предпочитаете использовать цикл foreach (я предпочитаю лямбду, так как мне легче ее читать), но если вы это сделаете, вы можете сделать это следующим образом.

foreach (IGrouping<string, Student> groupedStudents in listOfStudents.GroupBy(g => g.Class))
            {
                response.Add(groupedStudents.OrderByDescending(x => x.CreatedOn).Select(a =>
                new ResponseClass
                {
                    SName = a.StudentName,
                    SAge = a.Age,
                    SClass = a.Class,
                    SCreatedOn = a.CreatedOn,
                    RandomProperty = Guid.NewGuid().ToString()
                }).First());
            }

Надеюсь, это кому-нибудь поможет.:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...