在 SQL 中 group by 是很常見的語法,而在 LINQ 中也有實作對應的語法,只是筆者一直以來較少用到 LINQ 上的這項功能,所以寫了篇文章簡單筆記一下。

首先定義一個類別來做測試:

public class Person
{
    public string Name { get; set; } = string.Empty;
    public int Age { get; set; }
    public bool Gender { get; set; }
    public DateOnly Birthday { get; set; }
    public string City { get; set; } = string.Empty;

    public static List<Person> GetPeople()
    {
        var list = new List<Person>
        {
            new Person { Name = "Peter", Age = 40, Gender = true, Birthday = new DateOnly(1983, 9, 22), City = "Taipei" },
            new Person { Name = "John", Age = 36, Gender = true, Birthday = new DateOnly(1990, 4, 3), City = "Taipei" },
            new Person { Name = "Yuki", Age = 18, Gender = false, Birthday = new DateOnly(1992, 5, 4), City = "New Taipei City" },
            new Person { Name = "Ally", Age = 37, Gender = true, Birthday = new DateOnly(1985, 4, 7), City = "New Taipei City" },
            new Person { Name = "Peter", Age = 44, Gender = true, Birthday = new DateOnly(1989, 9, 21), City = "New Taipei City" },
            new Person { Name= "Mary", Age = 17, Gender = false, Birthday = new DateOnly(2001, 1, 4), City = "Taichung Tourism" },
        };

        return list;
    }
}

從上面的程式中,可以看到經過 group by 語法整理出來的資料要塞進一個變數中。而假如 group by 的條件不只一個時該怎麼做?程式碼如下:

var result = from p in people
               group p by new { p.Gender, p.Name } into gender
               select gender;
foreach (var item in result)
{
    var key = item.Key;
    Console.WriteLine(key.Name);
    Console.WriteLine(key.Gender);
    Console.WriteLine();
}