首页 / 教程列表 / LINQ教程 / LINQ操作符之GroupBy

LINQ操作符之GroupBy

1289 更新于: 2021-11-18 读完约需 11 分钟

LINQ分组操作符:GroupBy和ToLookup

分组是指将数据放入组中,使每个组中的元素共享一个公共属性的操作。

LINQ分组操作符的作用与SQL查询的Group By子句相同。分组操作符根据给定的键创建一组元素。这个组包含在一个特殊类型的集合中,该集合实现了一个IGrouping<TKey,TSource>接口,其中TKey是一个键值,在这个键值上形成了组,而TSource是与分组键值匹配的元素集合。

下图显示了对字符序列进行分组的结果。每个组的键是字符。

下表列出了分组数据元素的标准查询操作符方法。

方法名 描述 LINQ查询语法 相关信息
GroupBy 对具有共同属性的元素进行分组。每个组由一个IGrouping对象表示。 group … by
-或者-
group … by … into …
Enumerable.GroupBy Queryable.GroupBy
ToLookup 根据键选择器函数将元素插入Lookup(一对多字典)中。 不适用 Enumerable.ToLookup

GroupBy

在本系列教程的素材中,我们有订单集合,其中每个订单都有来源(Source),来源分别为:“线上”和“线下”。现在需要根据Source对订单集合进行分组,将相同来源的订单放在同一个子集合中,每个分组集合将有一个键和内部集合,其中的键将是来源(Source),内部集合将包括来源与键匹配的所有订单。
使用LINQ的查询语法实现的按订单来源(Source)分组的示例代码如下:

public class MyProgram
{
    static void Main(string[] args)
    {
        var orders = FakeData.Orders;

        // LINQ分组--查询语法
        var groupedResult = from o in orders
                            group o by o.Source;
        // 输入并查看分组结果
        foreach (var group in groupedResult)
        {
            // 输出分组的键(Key)
            Console.WriteLine($"分组键:{group.Key}");
            foreach (var order in group)
            {
                Console.WriteLine($"\t{order.Id},{order.Customer},{order.Price},{order.Source}");
            }
        }

        Console.ReadKey();
    }
}

运行结果为:

分组键:线上
        1,Rector,3699,线上
        2,James,2699,线上
        4,Steven,5699,线上
        6,Rector,5699,线上
分组键:线下
        3,Chris,1999,线下
        5,Jo,2569,线下

以下是LINQ方法语法实现的GroupBy分组查询示例代码:

public class MyProgram
{
    static void Main(string[] args)
    {
        var orders = FakeData.Orders;

        // LINQ分组--查询语法
        //var groupedResult = from o in orders
        //                    group o by o.Source;

        // LINQ分组--方法语法
        var groupedResult = orders.GroupBy(g => g.Source);

        // 输入并查看分组结果
        foreach (var group in groupedResult)
        {
            // 输出分组的键(Key)
            Console.WriteLine($"分组键:{group.Key}");
            foreach (var order in group)
            {
                Console.WriteLine($"\t{order.Id},{order.Customer},{order.Price},{order.Source}");
            }
        }

        Console.ReadKey();
    }
}

运行结果同上。

GroupBy多字段分组

public class MyProgram
{
    static void Main(string[] args)
    {
        var orders = FakeData.Orders;

        // LINQ分组--查询语法
        var groupedResult = from o in orders
                            group o by new { o.Source, o.Customer };

        // 输入并查看分组结果
        foreach (var group in groupedResult)
        {
            // 输出分组的键(Key)
            Console.WriteLine($"分组键:{group.Key}");
            foreach (var order in group)
            {
                Console.WriteLine($"\t{order.Id},{order.Customer},{order.Price},{order.Source}");
            }
        }

        Console.ReadKey();
    }
}

运行结果为:

分组键:{ Source = 线上, Customer = Rector }
        1,Rector,3699,线上
        6,Rector,5699,线上
分组键:{ Source = 线上, Customer = James }
        2,James,2699,线上
分组键:{ Source = 线下, Customer = Chris }
        3,Chris,1999,线下
分组键:{ Source = 线上, Customer = Steven }
        4,Steven,5699,线上
分组键:{ Source = 线下, Customer = Jo }
        5,Jo,2569,线下

以下是使用LINQ方法语法按订单来源(Source),客户(Customer)两个字段进行的分组示例:

public class MyProgram
{
    static void Main(string[] args)
    {
        var orders = FakeData.Orders;

        // LINQ分组--方法语法
        var groupedResult = orders.GroupBy(g => new { g.Source, g.Customer });

        // 输入并查看分组结果
        foreach (var group in groupedResult)
        {
            // 输出分组的键(Key)
            Console.WriteLine($"分组键:{group.Key}");
            foreach (var order in group)
            {
                Console.WriteLine($"\t{order.Id},{order.Customer},{order.Price},{order.Source}");
            }
        }

        Console.ReadKey();
    }
}

运行结果同上LINQ查询语法。

GroupBy除了对集合进行分组筛选外,还可以对集合进行分组聚合统计,如:SUM,AVG,MAX,MIN,COUNT等,将在后续相关章节中介绍。

版权声明:本作品系原创,版权归码友网所有,如未经许可,禁止任何形式转载,违者必究。

本文永久链接码友网 » LINQ教程 » LINQ操作符之GroupBy 分享:

发表评论

登录用户才能发表评论, 请 登 录 或者 注册