根据指定的键选择器函数对序列中的元素进行分组。
命名空间: System.Linq
程序集: System.Core(在 System.Core.dll 中)
public static IQueryable<IGrouping<TKey, TSource>> GroupBy<TSource, TKey>( this IQueryable<TSource> source, Expression<Func<TSource, TKey>> keySelector )
类型参数
- TSource
-
source 中的元素的类型。
- TKey
-
由 keySelector 表示的函数返回的键类型。
参数
- source
- 类型:System.Linq.IQueryable<TSource>
要对其元素进行分组的 IQueryable<T>。
- keySelector
- 类型:System.Linq.Expressions.Expression<Func<TSource, TKey>>
用于提取每个元素的键的函数。
返回值
类型:System.Linq.IQueryable<IGrouping<TKey, TSource>>在 C# 中为 IQueryable<IGrouping<TKey, TSource>>,或者在 Visual Basic 中为 IQueryable(Of IGrouping(Of TKey, TSource)),其中每个 IGrouping<TKey, TElement> 对象都包含一个对象序列和一个键。
使用说明
在 Visual Basic 和 C# 中,可以在 IQueryable<TSource> 类型的任何对象上将此方法作为实例方法来调用。当使用实例方法语法调用此方法时,请省略第一个参数。有关更多信息,请参见扩展方法 (Visual Basic)或扩展方法(C# 编程指南)。异常 | 条件 |
---|---|
ArgumentNullException |
source 或 keySelector 为 null。 |
此方法至少有一个 Expression<TDelegate> 类型的实参,其形参类型是 Func<T, TResult> 类型之一。 对于这些参数,您可以 lambda 表达式形式传递,并且该表达式将被编译为 Expression<TDelegate>。
GroupBy<TSource, TKey>(IQueryable<TSource>, Expression<Func<TSource, TKey>>) 方法生成 MethodCallExpression,表示调用 GroupBy<TSource, TKey>(IQueryable<TSource>, Expression<Func<TSource, TKey>>) 自身作为构造的泛型方法。 然后,它将 MethodCallExpression 传递给 IQueryProvider 的 CreateQuery<TElement>(Expression) 方法,由 source 参数的 Provider 属性表示。
因执行表示调用 GroupBy<TSource, TKey>(IQueryable<TSource>, Expression<Func<TSource, TKey>>) 的表达式目录树而发生的查询行为取决于 source 参数类型的实现。 预期的行为是根据键值对 source 中的元素进行分组,而键值是通过对每个元素调用 keySelector 获得的。
下面的代码示例演示如何使用 GroupBy<TSource, TKey>(IQueryable<TSource>, Expression<Func<TSource, TKey>>) 对序列中的元素进行分组。
class Pet { public string Name { get; set; } public int Age { get; set; } } public static void GroupByEx1() { // Create a list of Pet objects. List<Pet> pets = new List<Pet>{ new Pet { Name="Barley", Age=8 }, new Pet { Name="Boots", Age=4 }, new Pet { Name="Whiskers", Age=1 }, new Pet { Name="Daisy", Age=4 } }; // Group the pets using Pet.Age as the key. // Use Pet.Name as the value for each entry. var query = pets.AsQueryable().GroupBy(pet => pet.Age); // Iterate over each IGrouping in the collection. foreach (var ageGroup in query) { Console.WriteLine("Age group: {0} Number of pets: {1}", ageGroup.Key, ageGroup.Count()); } } /* This code produces the following output: Age group: 8 Number of pets: 1 Age group: 4 Number of pets: 2 Age group: 1 Number of pets: 1 */