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等,将在后续相关章节中介绍。
发表评论
登录用户才能发表评论, 请 登 录 或者 注册