Enumerable.GroupBy 方法

定义

对序列中的元素进行分组。Groups the elements of a sequence.

重载

GroupBy<TSource,TKey,TElement,TResult>(IEnumerable<TSource>, Func<TSource,TKey>, Func<TSource,TElement>, Func<TKey,IEnumerable<TElement>,TResult>)

根据指定的键选择器函数对序列中的元素进行分组,并且从每个组及其键中创建结果值。Groups the elements of a sequence according to a specified key selector function and creates a result value from each group and its key. 通过使用指定的函数对每个组的元素进行投影。The elements of each group are projected by using a specified function.

GroupBy<TSource,TKey,TElement,TResult>(IEnumerable<TSource>, Func<TSource,TKey>, Func<TSource,TElement>, Func<TKey,IEnumerable<TElement>,TResult>, IEqualityComparer<TKey>)

根据指定的键选择器函数对序列中的元素进行分组,并且从每个组及其键中创建结果值。Groups the elements of a sequence according to a specified key selector function and creates a result value from each group and its key. 通过使用指定的比较器对键值进行比较,并且通过使用指定的函数对每个组的元素进行投影。Key values are compared by using a specified comparer, and the elements of each group are projected by using a specified function.

GroupBy<TSource,TKey,TElement>(IEnumerable<TSource>, Func<TSource,TKey>, Func<TSource,TElement>)

根据指定的键选择器函数对序列中的元素进行分组,并且通过使用指定的函数对每个组中的元素进行投影。Groups the elements of a sequence according to a specified key selector function and projects the elements for each group by using a specified function.

GroupBy<TSource,TKey,TElement>(IEnumerable<TSource>, Func<TSource,TKey>, Func<TSource,TElement>, IEqualityComparer<TKey>)

根据键选择器函数对序列中的元素进行分组。Groups the elements of a sequence according to a key selector function. 通过使用比较器对键进行比较,并且通过使用指定的函数对每个组的元素进行投影。The keys are compared by using a comparer and each group's elements are projected by using a specified function.

GroupBy<TSource,TKey,TResult>(IEnumerable<TSource>, Func<TSource,TKey>, Func<TKey,IEnumerable<TSource>,TResult>)

根据指定的键选择器函数对序列中的元素进行分组,并且从每个组及其键中创建结果值。Groups the elements of a sequence according to a specified key selector function and creates a result value from each group and its key.

GroupBy<TSource,TKey,TResult>(IEnumerable<TSource>, Func<TSource,TKey>, Func<TKey,IEnumerable<TSource>,TResult>, IEqualityComparer<TKey>)

根据指定的键选择器函数对序列中的元素进行分组,并且从每个组及其键中创建结果值。Groups the elements of a sequence according to a specified key selector function and creates a result value from each group and its key. 通过使用指定的比较器对键进行比较。The keys are compared by using a specified comparer.

GroupBy<TSource,TKey>(IEnumerable<TSource>, Func<TSource,TKey>)

根据指定的键选择器函数对序列中的元素进行分组。Groups the elements of a sequence according to a specified key selector function.

GroupBy<TSource,TKey>(IEnumerable<TSource>, Func<TSource,TKey>, IEqualityComparer<TKey>)

根据指定的键选择器函数对序列中的元素进行分组,并使用指定的比较器对键进行比较。Groups the elements of a sequence according to a specified key selector function and compares the keys by using a specified comparer.

GroupBy<TSource,TKey,TElement,TResult>(IEnumerable<TSource>, Func<TSource,TKey>, Func<TSource,TElement>, Func<TKey,IEnumerable<TElement>,TResult>)

根据指定的键选择器函数对序列中的元素进行分组,并且从每个组及其键中创建结果值。Groups the elements of a sequence according to a specified key selector function and creates a result value from each group and its key. 通过使用指定的函数对每个组的元素进行投影。The elements of each group are projected by using a specified function.

public:
generic <typename TSource, typename TKey, typename TElement, typename TResult>
[System::Runtime::CompilerServices::Extension]
 static System::Collections::Generic::IEnumerable<TResult> ^ GroupBy(System::Collections::Generic::IEnumerable<TSource> ^ source, Func<TSource, TKey> ^ keySelector, Func<TSource, TElement> ^ elementSelector, Func<TKey, System::Collections::Generic::IEnumerable<TElement> ^, TResult> ^ resultSelector);
public static System.Collections.Generic.IEnumerable<TResult> GroupBy<TSource,TKey,TElement,TResult> (this System.Collections.Generic.IEnumerable<TSource> source, Func<TSource,TKey> keySelector, Func<TSource,TElement> elementSelector, Func<TKey,System.Collections.Generic.IEnumerable<TElement>,TResult> resultSelector);
static member GroupBy : seq<'Source> * Func<'Source, 'Key> * Func<'Source, 'Element> * Func<'Key, seq<'Element>, 'Result> -> seq<'Result>
<Extension()>
Public Function GroupBy(Of TSource, TKey, TElement, TResult) (source As IEnumerable(Of TSource), keySelector As Func(Of TSource, TKey), elementSelector As Func(Of TSource, TElement), resultSelector As Func(Of TKey, IEnumerable(Of TElement), TResult)) As IEnumerable(Of TResult)

类型参数

TSource

source 的元素类型。The type of the elements of source.

TKey

keySelector 返回的键的类型。The type of the key returned by keySelector.

TElement

每个 IGrouping<TKey,TElement> 中的元素的类型。The type of the elements in each IGrouping<TKey,TElement>.

TResult

resultSelector 返回的结果值的类型。The type of the result value returned by resultSelector.

参数

source
IEnumerable<TSource>

要对其元素进行分组的 IEnumerable<T>An IEnumerable<T> whose elements to group.

keySelector
Func<TSource,TKey>

用于提取每个元素的键的函数。A function to extract the key for each element.

elementSelector
Func<TSource,TElement>

用于将每个源元素映射到 IGrouping<TKey,TElement> 中的元素的函数。A function to map each source element to an element in an IGrouping<TKey,TElement>.

resultSelector
Func<TKey,IEnumerable<TElement>,TResult>

用于从每个组中创建结果值的函数。A function to create a result value from each group.

返回

IEnumerable<TResult>

类型为 TResult 的元素的集合,其中的每个元素都表示对一个组及其键的投影。A collection of elements of type TResult where each element represents a projection over a group and its key.

示例

下面的代码示例演示如何使用 GroupBy<TSource,TKey,TElement,TResult>(IEnumerable<TSource>, Func<TSource,TKey>, Func<TSource,TElement>, Func<TKey,IEnumerable<TElement>,TResult>) 对序列中的投影元素进行分组,然后投影一系列类型的结果 TResultThe following code example demonstrates how to use GroupBy<TSource,TKey,TElement,TResult>(IEnumerable<TSource>, Func<TSource,TKey>, Func<TSource,TElement>, Func<TKey,IEnumerable<TElement>,TResult>) to group the projected elements of a sequence and then project a sequence of results of type TResult.

class Pet
{
    public string Name { get; set; }
    public double Age { get; set; }
}

public static void GroupByEx4()
{
    // Create a list of pets.
    List<Pet> petsList =
        new List<Pet>{ new Pet { Name="Barley", Age=8.3 },
                       new Pet { Name="Boots", Age=4.9 },
                       new Pet { Name="Whiskers", Age=1.5 },
                       new Pet { Name="Daisy", Age=4.3 } };

    // Group Pet.Age values by the Math.Floor of the age.
    // Then project an anonymous type from each group
    // that consists of the key, the count of the group's
    // elements, and the minimum and maximum age in the group.
    var query = petsList.GroupBy(
        pet => Math.Floor(pet.Age),
        pet => pet.Age,
        (baseAge, ages) => new
        {
            Key = baseAge,
            Count = ages.Count(),
            Min = ages.Min(),
            Max = ages.Max()
        });

    // Iterate over each anonymous type.
    foreach (var result in query)
    {
        Console.WriteLine("\nAge group: " + result.Key);
        Console.WriteLine("Number of pets in this age group: " + result.Count);
        Console.WriteLine("Minimum age: " + result.Min);
        Console.WriteLine("Maximum age: " + result.Max);
    }

    /*  This code produces the following output:

        Age group: 8
        Number of pets in this age group: 1
        Minimum age: 8.3
        Maximum age: 8.3

        Age group: 4
        Number of pets in this age group: 2
        Minimum age: 4.3
        Maximum age: 4.9

        Age group: 1
        Number of pets in this age group: 1
        Minimum age: 1.5
        Maximum age: 1.5
    */
}
Structure Pet
    Public Name As String
    Public Age As Double
End Structure

Public Sub GroupByEx4()
    ' Create a list of pets.
    Dim petsList As New List(Of Pet)(New Pet() _
                         {New Pet With {.Name = "Barley", .Age = 8.3},
                          New Pet With {.Name = "Boots", .Age = 4.9},
                          New Pet With {.Name = "Whiskers", .Age = 1.5},
                          New Pet With {.Name = "Daisy", .Age = 4.3}})

    ' Group Pet.Age values by the Math.Floor of the age.
    ' Then project an anonymous type from each group
    ' that consists of the key, the count of the group's
    ' elements, and the minimum and maximum age in the group.
    Dim query = petsList.GroupBy(
Function(pet) Math.Floor(pet.Age),
Function(pet) pet.Age,
Function(baseAge, ages) New With
    {.Key = baseAge,
    .Count = ages.Count(),
    .Min = ages.Min(),
    .Max = ages.Max()}
)

    Dim output As New System.Text.StringBuilder
    ' Iterate over each anonymous type.
    For Each result In query
        output.AppendLine(vbCrLf & "Age group: " & result.Key)
        output.AppendLine("Number of pets in this age group: " & result.Count)
        output.AppendLine("Minimum age: " & result.Min)
        output.AppendLine("Maximum age: " & result.Max)
    Next

    ' Display the output.
    Console.WriteLine(output.ToString)
End Sub

' This code produces the following output:

' Age group: 8
' Number of pets in this age group: 1
' Minimum age: 8.3
' Maximum age: 8.3
'
' Age group: 4
' Number of pets in this age group: 2
' Minimum age: 4.3
' Maximum age: 4.9
'
' Age group: 1
' Number of pets in this age group: 1
' Minimum age: 1.5
' Maximum age: 1.5

注解

在查询表达式语法中, group by (Visual c # ) 或 Group By Into (Visual Basic) 子句转换为对的调用 GroupByIn query expression syntax, a group by (Visual C#) or Group By Into (Visual Basic) clause translates to an invocation of GroupBy.

另请参阅

适用于

产品 Introduced

GroupBy<TSource,TKey,TElement,TResult>(IEnumerable<TSource>, Func<TSource,TKey>, Func<TSource,TElement>, Func<TKey,IEnumerable<TElement>,TResult>, IEqualityComparer<TKey>)

根据指定的键选择器函数对序列中的元素进行分组,并且从每个组及其键中创建结果值。Groups the elements of a sequence according to a specified key selector function and creates a result value from each group and its key. 通过使用指定的比较器对键值进行比较,并且通过使用指定的函数对每个组的元素进行投影。Key values are compared by using a specified comparer, and the elements of each group are projected by using a specified function.

public:
generic <typename TSource, typename TKey, typename TElement, typename TResult>
[System::Runtime::CompilerServices::Extension]
 static System::Collections::Generic::IEnumerable<TResult> ^ GroupBy(System::Collections::Generic::IEnumerable<TSource> ^ source, Func<TSource, TKey> ^ keySelector, Func<TSource, TElement> ^ elementSelector, Func<TKey, System::Collections::Generic::IEnumerable<TElement> ^, TResult> ^ resultSelector, System::Collections::Generic::IEqualityComparer<TKey> ^ comparer);
public static System.Collections.Generic.IEnumerable<TResult> GroupBy<TSource,TKey,TElement,TResult> (this System.Collections.Generic.IEnumerable<TSource> source, Func<TSource,TKey> keySelector, Func<TSource,TElement> elementSelector, Func<TKey,System.Collections.Generic.IEnumerable<TElement>,TResult> resultSelector, System.Collections.Generic.IEqualityComparer<TKey> comparer);
public static System.Collections.Generic.IEnumerable<TResult> GroupBy<TSource,TKey,TElement,TResult> (this System.Collections.Generic.IEnumerable<TSource> source, Func<TSource,TKey> keySelector, Func<TSource,TElement> elementSelector, Func<TKey,System.Collections.Generic.IEnumerable<TElement>,TResult> resultSelector, System.Collections.Generic.IEqualityComparer<TKey>? comparer);
static member GroupBy : seq<'Source> * Func<'Source, 'Key> * Func<'Source, 'Element> * Func<'Key, seq<'Element>, 'Result> * System.Collections.Generic.IEqualityComparer<'Key> -> seq<'Result>
<Extension()>
Public Function GroupBy(Of TSource, TKey, TElement, TResult) (source As IEnumerable(Of TSource), keySelector As Func(Of TSource, TKey), elementSelector As Func(Of TSource, TElement), resultSelector As Func(Of TKey, IEnumerable(Of TElement), TResult), comparer As IEqualityComparer(Of TKey)) As IEnumerable(Of TResult)

类型参数

TSource

source 的元素类型。The type of the elements of source.

TKey

keySelector 返回的键的类型。The type of the key returned by keySelector.

TElement

每个 IGrouping<TKey,TElement> 中的元素的类型。The type of the elements in each IGrouping<TKey,TElement>.

TResult

resultSelector 返回的结果值的类型。The type of the result value returned by resultSelector.

参数

source
IEnumerable<TSource>

要对其元素进行分组的 IEnumerable<T>An IEnumerable<T> whose elements to group.

keySelector
Func<TSource,TKey>

用于提取每个元素的键的函数。A function to extract the key for each element.

elementSelector
Func<TSource,TElement>

用于将每个源元素映射到 IGrouping<TKey,TElement> 中的元素的函数。A function to map each source element to an element in an IGrouping<TKey,TElement>.

resultSelector
Func<TKey,IEnumerable<TElement>,TResult>

用于从每个组中创建结果值的函数。A function to create a result value from each group.

comparer
IEqualityComparer<TKey>

用于对键进行比较的 IEqualityComparer<T>An IEqualityComparer<T> to compare keys with.

返回

IEnumerable<TResult>

类型为 TResult 的元素的集合,其中的每个元素都表示对一个组及其键的投影。A collection of elements of type TResult where each element represents a projection over a group and its key.

另请参阅

适用于

产品 Introduced

GroupBy<TSource,TKey,TElement>(IEnumerable<TSource>, Func<TSource,TKey>, Func<TSource,TElement>)

根据指定的键选择器函数对序列中的元素进行分组,并且通过使用指定的函数对每个组中的元素进行投影。Groups the elements of a sequence according to a specified key selector function and projects the elements for each group by using a specified function.

public:
generic <typename TSource, typename TKey, typename TElement>
[System::Runtime::CompilerServices::Extension]
 static System::Collections::Generic::IEnumerable<System::Linq::IGrouping<TKey, TElement> ^> ^ GroupBy(System::Collections::Generic::IEnumerable<TSource> ^ source, Func<TSource, TKey> ^ keySelector, Func<TSource, TElement> ^ elementSelector);
public static System.Collections.Generic.IEnumerable<System.Linq.IGrouping<TKey,TElement>> GroupBy<TSource,TKey,TElement> (this System.Collections.Generic.IEnumerable<TSource> source, Func<TSource,TKey> keySelector, Func<TSource,TElement> elementSelector);
static member GroupBy : seq<'Source> * Func<'Source, 'Key> * Func<'Source, 'Element> -> seq<System.Linq.IGrouping<'Key, 'Element>>
<Extension()>
Public Function GroupBy(Of TSource, TKey, TElement) (source As IEnumerable(Of TSource), keySelector As Func(Of TSource, TKey), elementSelector As Func(Of TSource, TElement)) As IEnumerable(Of IGrouping(Of TKey, TElement))

类型参数

TSource

source 的元素类型。The type of the elements of source.

TKey

keySelector 返回的键的类型。The type of the key returned by keySelector.

TElement

IGrouping<TKey,TElement> 中元素的类型。The type of the elements in the IGrouping<TKey,TElement>.

参数

source
IEnumerable<TSource>

要对其元素进行分组的 IEnumerable<T>An IEnumerable<T> whose elements to group.

keySelector
Func<TSource,TKey>

用于提取每个元素的键的函数。A function to extract the key for each element.

elementSelector
Func<TSource,TElement>

用于将每个源元素映射到 IGrouping<TKey,TElement> 中的元素的函数。A function to map each source element to an element in the IGrouping<TKey,TElement>.

返回

IEnumerable<IGrouping<TKey,TElement>>

C# 中的 IEnumerable<IGrouping<TKey, TElement>> 或 Visual Basic 中的 IEnumerable(Of IGrouping(Of TKey, TElement)),其中的每个 IGrouping<TKey,TElement> 对象均包含一个类型为 TElement 的对象集合和键。An IEnumerable<IGrouping<TKey, TElement>> in C# or IEnumerable(Of IGrouping(Of TKey, TElement)) in Visual Basic where each IGrouping<TKey,TElement> object contains a collection of objects of type TElement and a key.

例外

sourcekeySelectorelementSelectornullsource or keySelector or elementSelector is null.

示例

下面的代码示例演示如何使用 GroupBy<TSource,TKey,TElement>(IEnumerable<TSource>, Func<TSource,TKey>, Func<TSource,TElement>) 对序列中的元素进行分组。The following code example demonstrates how to use GroupBy<TSource,TKey,TElement>(IEnumerable<TSource>, Func<TSource,TKey>, Func<TSource,TElement>) to group the elements of a sequence.

class Pet
{
    public string Name { get; set; }
    public int Age { get; set; }
}

// Uses method-based query syntax.
public static void GroupByEx1()
{
    // Create a list of pets.
    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 Age as the key value
    // and selecting only the pet's Name for each value.
    IEnumerable<IGrouping<int, string>> query =
        pets.GroupBy(pet => pet.Age, pet => pet.Name);

    // Iterate over each IGrouping in the collection.
    foreach (IGrouping<int, string> petGroup in query)
    {
        // Print the key value of the IGrouping.
        Console.WriteLine(petGroup.Key);
        // Iterate over each value in the
        // IGrouping and print the value.
        foreach (string name in petGroup)
            Console.WriteLine("  {0}", name);
    }
}

/*
 This code produces the following output:

 8
   Barley
 4
   Boots
   Daisy
 1
   Whiskers
*/
Structure Pet
    Public Name As String
    Public Age As Integer
End Structure

Sub GroupByEx1()
    'Create a list of Pet objects.
    Dim pets As New List(Of Pet)(New Pet() _
                         {New Pet With {.Name = "Barley", .Age = 8},
                          New Pet With {.Name = "Boots", .Age = 4},
                          New Pet With {.Name = "Whiskers", .Age = 1},
                          New Pet With {.Name = "Daisy", .Age = 4}})

    ' Group the pets using Age as the key 
    ' and selecting only the pet's Name for each value.
    Dim query As IEnumerable(Of IGrouping(Of Integer, String)) =
pets.GroupBy(Function(pet) pet.Age,
             Function(pet) pet.Name)

    Dim output As New System.Text.StringBuilder
    ' Iterate over each IGrouping in the collection.
    For Each petGroup As IGrouping(Of Integer, String) In query
        ' Print the key value of the IGrouping.
        output.AppendLine(petGroup.Key)
        ' Iterate over each value in the IGrouping and print the value.
        For Each name As String In petGroup
            output.AppendLine("  " & name)
        Next
    Next

    ' Display the output.
    Console.WriteLine(output.ToString)
End Sub

' This code produces the following output:
'
' 8
'   Barley
' 4
'   Boots
'   Daisy
' 1
'   Whiskers

在查询表达式语法中, group by (Visual c # ) 或 Group By Into (Visual Basic) 子句转换为对的调用 GroupByIn query expression syntax, a group by (Visual C#) or Group By Into (Visual Basic) clause translates to an invocation of GroupBy. 以下示例中的查询表达式转换等效于上面示例中的查询。The translation of the query expression in the following example is equivalent to the query in the example above.

IEnumerable<IGrouping<int, string>> query =
    from pet in pets
    group pet.Name by pet.Age;
    Dim query =
From pet In pets
Group pet.Name By Age = pet.Age Into ageGroup = Group

备注

在 Visual c # 或 Visual Basic 查询表达式中,元素和键选择表达式在调用方法的参数位置中以相反顺序发生 GroupBy<TSource,TKey,TElement>(IEnumerable<TSource>, Func<TSource,TKey>, Func<TSource,TElement>)In a Visual C# or Visual Basic query expression, the element and key selection expressions occur in the reverse order from their argument positions in a call to the GroupBy<TSource,TKey,TElement>(IEnumerable<TSource>, Func<TSource,TKey>, Func<TSource,TElement>) method.

注解

此方法是使用延迟执行实现的。This method is implemented by using deferred execution. 即时返回值是一个对象,该对象存储执行操作所需的所有信息。The immediate return value is an object that stores all the information that is required to perform the action. 此方法表示的查询在枚举对象之前不会执行,方法是直接调用其 GetEnumerator 方法,或者通过 foreach 在 Visual c # 中使用或 For Each 在 Visual Basic 中使用。The query represented by this method is not executed until the object is enumerated either by calling its GetEnumerator method directly or by using foreach in Visual C# or For Each in Visual Basic.

GroupBy<TSource,TKey,TElement>(IEnumerable<TSource>, Func<TSource,TKey>, Func<TSource,TElement>)方法返回对象的集合 IGrouping<TKey,TElement> ,每个对象对应于遇到的每个非重复键。The GroupBy<TSource,TKey,TElement>(IEnumerable<TSource>, Func<TSource,TKey>, Func<TSource,TElement>) method returns a collection of IGrouping<TKey,TElement> objects, one for each distinct key that was encountered. IGrouping<TKey,TElement>是一个 IEnumerable<T> ,它还具有与其元素关联的键。An IGrouping<TKey,TElement> is an IEnumerable<T> that also has a key associated with its elements.

IGrouping<TKey,TElement>根据 source 生成每个对象的第一个键的中的元素的顺序,按顺序生成对象 IGrouping<TKey,TElement>The IGrouping<TKey,TElement> objects are yielded in an order based on the order of the elements in source that produced the first key of each IGrouping<TKey,TElement>. 分组中的元素将按生成它们的元素出现的顺序生成 sourceElements in a grouping are yielded in the order that the elements that produced them appear in source.

使用默认的相等比较器 Default 对键进行比较。The default equality comparer Default is used to compare keys.

另请参阅

适用于

产品 Introduced

GroupBy<TSource,TKey,TElement>(IEnumerable<TSource>, Func<TSource,TKey>, Func<TSource,TElement>, IEqualityComparer<TKey>)

根据键选择器函数对序列中的元素进行分组。Groups the elements of a sequence according to a key selector function. 通过使用比较器对键进行比较,并且通过使用指定的函数对每个组的元素进行投影。The keys are compared by using a comparer and each group's elements are projected by using a specified function.

public:
generic <typename TSource, typename TKey, typename TElement>
[System::Runtime::CompilerServices::Extension]
 static System::Collections::Generic::IEnumerable<System::Linq::IGrouping<TKey, TElement> ^> ^ GroupBy(System::Collections::Generic::IEnumerable<TSource> ^ source, Func<TSource, TKey> ^ keySelector, Func<TSource, TElement> ^ elementSelector, System::Collections::Generic::IEqualityComparer<TKey> ^ comparer);
public static System.Collections.Generic.IEnumerable<System.Linq.IGrouping<TKey,TElement>> GroupBy<TSource,TKey,TElement> (this System.Collections.Generic.IEnumerable<TSource> source, Func<TSource,TKey> keySelector, Func<TSource,TElement> elementSelector, System.Collections.Generic.IEqualityComparer<TKey> comparer);
public static System.Collections.Generic.IEnumerable<System.Linq.IGrouping<TKey,TElement>> GroupBy<TSource,TKey,TElement> (this System.Collections.Generic.IEnumerable<TSource> source, Func<TSource,TKey> keySelector, Func<TSource,TElement> elementSelector, System.Collections.Generic.IEqualityComparer<TKey>? comparer);
static member GroupBy : seq<'Source> * Func<'Source, 'Key> * Func<'Source, 'Element> * System.Collections.Generic.IEqualityComparer<'Key> -> seq<System.Linq.IGrouping<'Key, 'Element>>
<Extension()>
Public Function GroupBy(Of TSource, TKey, TElement) (source As IEnumerable(Of TSource), keySelector As Func(Of TSource, TKey), elementSelector As Func(Of TSource, TElement), comparer As IEqualityComparer(Of TKey)) As IEnumerable(Of IGrouping(Of TKey, TElement))

类型参数

TSource

source 的元素类型。The type of the elements of source.

TKey

keySelector 返回的键的类型。The type of the key returned by keySelector.

TElement

IGrouping<TKey,TElement> 中元素的类型。The type of the elements in the IGrouping<TKey,TElement>.

参数

source
IEnumerable<TSource>

要对其元素进行分组的 IEnumerable<T>An IEnumerable<T> whose elements to group.

keySelector
Func<TSource,TKey>

用于提取每个元素的键的函数。A function to extract the key for each element.

elementSelector
Func<TSource,TElement>

用于将每个源元素映射到 IGrouping<TKey,TElement> 中的元素的函数。A function to map each source element to an element in an IGrouping<TKey,TElement>.

comparer
IEqualityComparer<TKey>

用于比较键的 IEqualityComparer<T>An IEqualityComparer<T> to compare keys.

返回

IEnumerable<IGrouping<TKey,TElement>>

C# 中的 IEnumerable<IGrouping<TKey, TElement>> 或 Visual Basic 中的 IEnumerable(Of IGrouping(Of TKey, TElement)),其中的每个 IGrouping<TKey,TElement> 对象均包含一个类型为 TElement 的对象集合和键。An IEnumerable<IGrouping<TKey, TElement>> in C# or IEnumerable(Of IGrouping(Of TKey, TElement)) in Visual Basic where each IGrouping<TKey,TElement> object contains a collection of objects of type TElement and a key.

例外

sourcekeySelectorelementSelectornullsource or keySelector or elementSelector is null.

注解

此方法是使用延迟执行实现的。This method is implemented by using deferred execution. 即时返回值是一个对象,该对象存储执行操作所需的所有信息。The immediate return value is an object that stores all the information that is required to perform the action. 此方法表示的查询在枚举对象之前不会执行,方法是直接调用其 GetEnumerator 方法,或者通过 foreach 在 Visual c # 中使用或 For Each 在 Visual Basic 中使用。The query represented by this method is not executed until the object is enumerated either by calling its GetEnumerator method directly or by using foreach in Visual C# or For Each in Visual Basic.

GroupBy<TSource,TKey,TElement>(IEnumerable<TSource>, Func<TSource,TKey>, Func<TSource,TElement>, IEqualityComparer<TKey>)方法返回对象的集合 IGrouping<TKey,TElement> ,每个对象对应于遇到的每个非重复键。The GroupBy<TSource,TKey,TElement>(IEnumerable<TSource>, Func<TSource,TKey>, Func<TSource,TElement>, IEqualityComparer<TKey>) method returns a collection of IGrouping<TKey,TElement> objects, one for each distinct key that was encountered. IGrouping<TKey,TElement>是一个 IEnumerable<T> ,它还具有与其元素关联的键。An IGrouping<TKey,TElement> is an IEnumerable<T> that also has a key associated with its elements.

IGrouping<TKey,TElement>根据 source 生成每个对象的第一个键的中的元素的顺序,按顺序生成对象 IGrouping<TKey,TElement>The IGrouping<TKey,TElement> objects are yielded in an order based on the order of the elements in source that produced the first key of each IGrouping<TKey,TElement>. 分组中的元素将按生成它们的元素出现的顺序生成 sourceElements in a grouping are yielded in the order that the elements that produced them appear in source.

如果 comparernull ,则使用默认的相等比较器 Default 对键进行比较。If comparer is null, the default equality comparer Default is used to compare keys.

如果根据,两个键被视为相等 comparer ,则选择第一个键作为该分组的键。If two keys are considered equal according to comparer, the first key is chosen as the key for that grouping.

在查询表达式语法中, group by (Visual c # ) 或 Group By Into (Visual Basic) 子句转换为对的调用 GroupByIn query expression syntax, a group by (Visual C#) or Group By Into (Visual Basic) clause translates to an invocation of GroupBy. 有关详细信息和用法示例,请参阅 group 子句group by 子句For more information and usage examples, see group clause and Group By Clause.

另请参阅

适用于

产品 Introduced

GroupBy<TSource,TKey,TResult>(IEnumerable<TSource>, Func<TSource,TKey>, Func<TKey,IEnumerable<TSource>,TResult>)

根据指定的键选择器函数对序列中的元素进行分组,并且从每个组及其键中创建结果值。Groups the elements of a sequence according to a specified key selector function and creates a result value from each group and its key.

public:
generic <typename TSource, typename TKey, typename TResult>
[System::Runtime::CompilerServices::Extension]
 static System::Collections::Generic::IEnumerable<TResult> ^ GroupBy(System::Collections::Generic::IEnumerable<TSource> ^ source, Func<TSource, TKey> ^ keySelector, Func<TKey, System::Collections::Generic::IEnumerable<TSource> ^, TResult> ^ resultSelector);
public static System.Collections.Generic.IEnumerable<TResult> GroupBy<TSource,TKey,TResult> (this System.Collections.Generic.IEnumerable<TSource> source, Func<TSource,TKey> keySelector, Func<TKey,System.Collections.Generic.IEnumerable<TSource>,TResult> resultSelector);
static member GroupBy : seq<'Source> * Func<'Source, 'Key> * Func<'Key, seq<'Source>, 'Result> -> seq<'Result>
<Extension()>
Public Function GroupBy(Of TSource, TKey, TResult) (source As IEnumerable(Of TSource), keySelector As Func(Of TSource, TKey), resultSelector As Func(Of TKey, IEnumerable(Of TSource), TResult)) As IEnumerable(Of TResult)

类型参数

TSource

source 的元素类型。The type of the elements of source.

TKey

keySelector 返回的键的类型。The type of the key returned by keySelector.

TResult

resultSelector 返回的结果值的类型。The type of the result value returned by resultSelector.

参数

source
IEnumerable<TSource>

要对其元素进行分组的 IEnumerable<T>An IEnumerable<T> whose elements to group.

keySelector
Func<TSource,TKey>

用于提取每个元素的键的函数。A function to extract the key for each element.

resultSelector
Func<TKey,IEnumerable<TSource>,TResult>

用于从每个组中创建结果值的函数。A function to create a result value from each group.

返回

IEnumerable<TResult>

类型为 TResult 的元素的集合,其中的每个元素都表示对一个组及其键的投影。A collection of elements of type TResult where each element represents a projection over a group and its key.

示例

下面的代码示例演示如何使用 GroupBy<TSource,TKey,TResult>(IEnumerable<TSource>, Func<TSource,TKey>, Func<TKey,IEnumerable<TSource>,TResult>) 对序列中的元素进行分组,并投影一系列类型的结果 TResultThe following code example demonstrates how to use GroupBy<TSource,TKey,TResult>(IEnumerable<TSource>, Func<TSource,TKey>, Func<TKey,IEnumerable<TSource>,TResult>) to group the elements of a sequence and project a sequence of results of type TResult.

class Pet
{
    public string Name { get; set; }
    public double Age { get; set; }
}

public static void GroupByEx3()
{
    // Create a list of pets.
    List<Pet> petsList =
        new List<Pet>{ new Pet { Name="Barley", Age=8.3 },
                       new Pet { Name="Boots", Age=4.9 },
                       new Pet { Name="Whiskers", Age=1.5 },
                       new Pet { Name="Daisy", Age=4.3 } };

    // Group Pet objects by the Math.Floor of their age.
    // Then project an anonymous type from each group
    // that consists of the key, the count of the group's
    // elements, and the minimum and maximum age in the group.
    var query = petsList.GroupBy(
        pet => Math.Floor(pet.Age),
        (age, pets) => new
        {
            Key = age,
            Count = pets.Count(),
            Min = pets.Min(pet => pet.Age),
            Max = pets.Max(pet => pet.Age)
        });

    // Iterate over each anonymous type.
    foreach (var result in query)
    {
        Console.WriteLine("\nAge group: " + result.Key);
        Console.WriteLine("Number of pets in this age group: " + result.Count);
        Console.WriteLine("Minimum age: " + result.Min);
        Console.WriteLine("Maximum age: " + result.Max);
    }

    /*  This code produces the following output:

        Age group: 8
        Number of pets in this age group: 1
        Minimum age: 8.3
        Maximum age: 8.3

        Age group: 4
        Number of pets in this age group: 2
        Minimum age: 4.3
        Maximum age: 4.9

        Age group: 1
        Number of pets in this age group: 1
        Minimum age: 1.5
        Maximum age: 1.5
    */
}
Structure Pet
    Public Name As String
    Public Age As Double
End Structure

Public Sub GroupByEx3()
    ' Create a list of pets.
    Dim petsList As New List(Of Pet)(New Pet() _
                         {New Pet With {.Name = "Barley", .Age = 8.3},
                          New Pet With {.Name = "Boots", .Age = 4.9},
                          New Pet With {.Name = "Whiskers", .Age = 1.5},
                          New Pet With {.Name = "Daisy", .Age = 4.3}})

    ' Group Pet objects by the Math.Floor of their age.
    ' Then project an anonymous type from each group
    ' that consists of the key, the count of the group's
    ' elements, and the minimum and maximum age in the group.
    Dim query = petsList.GroupBy(
Function(pet) Math.Floor(pet.Age),
Function(age, pets) New With
    {.Key = age,
    .Count = pets.Count(),
    .Min = pets.Min(Function(pet) pet.Age),
    .Max = pets.Max(Function(Pet) Pet.Age)}
)

    Dim output As New System.Text.StringBuilder
    ' Iterate over each anonymous type.
    For Each result In query
        output.AppendLine(vbCrLf & "Age group: " & result.Key)
        output.AppendLine("Number of pets in this age group: " & result.Count)
        output.AppendLine("Minimum age: " & result.Min)
        output.AppendLine("Maximum age: " & result.Max)
    Next

    ' Display the output.
    Console.WriteLine(output.ToString)
End Sub

' This code produces the following output:

' Age group: 8
' Number of pets in this age group: 1
' Minimum age: 8.3
' Maximum age: 8.3
'
' Age group: 4
' Number of pets in this age group: 2
' Minimum age: 4.3
' Maximum age: 4.9
'
' Age group: 1
' Number of pets in this age group: 1
' Minimum age: 1.5
' Maximum age: 1.5

注解

在查询表达式语法中, group by (Visual c # ) 或 Group By Into (Visual Basic) 子句转换为对的调用 GroupByIn query expression syntax, a group by (Visual C#) or Group By Into (Visual Basic) clause translates to an invocation of GroupBy.

另请参阅

适用于

产品 Introduced

GroupBy<TSource,TKey,TResult>(IEnumerable<TSource>, Func<TSource,TKey>, Func<TKey,IEnumerable<TSource>,TResult>, IEqualityComparer<TKey>)

根据指定的键选择器函数对序列中的元素进行分组,并且从每个组及其键中创建结果值。Groups the elements of a sequence according to a specified key selector function and creates a result value from each group and its key. 通过使用指定的比较器对键进行比较。The keys are compared by using a specified comparer.

public:
generic <typename TSource, typename TKey, typename TResult>
[System::Runtime::CompilerServices::Extension]
 static System::Collections::Generic::IEnumerable<TResult> ^ GroupBy(System::Collections::Generic::IEnumerable<TSource> ^ source, Func<TSource, TKey> ^ keySelector, Func<TKey, System::Collections::Generic::IEnumerable<TSource> ^, TResult> ^ resultSelector, System::Collections::Generic::IEqualityComparer<TKey> ^ comparer);
public static System.Collections.Generic.IEnumerable<TResult> GroupBy<TSource,TKey,TResult> (this System.Collections.Generic.IEnumerable<TSource> source, Func<TSource,TKey> keySelector, Func<TKey,System.Collections.Generic.IEnumerable<TSource>,TResult> resultSelector, System.Collections.Generic.IEqualityComparer<TKey> comparer);
public static System.Collections.Generic.IEnumerable<TResult> GroupBy<TSource,TKey,TResult> (this System.Collections.Generic.IEnumerable<TSource> source, Func<TSource,TKey> keySelector, Func<TKey,System.Collections.Generic.IEnumerable<TSource>,TResult> resultSelector, System.Collections.Generic.IEqualityComparer<TKey>? comparer);
static member GroupBy : seq<'Source> * Func<'Source, 'Key> * Func<'Key, seq<'Source>, 'Result> * System.Collections.Generic.IEqualityComparer<'Key> -> seq<'Result>
<Extension()>
Public Function GroupBy(Of TSource, TKey, TResult) (source As IEnumerable(Of TSource), keySelector As Func(Of TSource, TKey), resultSelector As Func(Of TKey, IEnumerable(Of TSource), TResult), comparer As IEqualityComparer(Of TKey)) As IEnumerable(Of TResult)

类型参数

TSource

source 的元素类型。The type of the elements of source.

TKey

keySelector 返回的键的类型。The type of the key returned by keySelector.

TResult

resultSelector 返回的结果值的类型。The type of the result value returned by resultSelector.

参数

source
IEnumerable<TSource>

要对其元素进行分组的 IEnumerable<T>An IEnumerable<T> whose elements to group.

keySelector
Func<TSource,TKey>

用于提取每个元素的键的函数。A function to extract the key for each element.

resultSelector
Func<TKey,IEnumerable<TSource>,TResult>

用于从每个组中创建结果值的函数。A function to create a result value from each group.

comparer
IEqualityComparer<TKey>

用于对键进行比较的 IEqualityComparer<T>An IEqualityComparer<T> to compare keys with.

返回

IEnumerable<TResult>

类型为 TResult 的元素的集合,其中的每个元素都表示对一个组及其键的投影。A collection of elements of type TResult where each element represents a projection over a group and its key.

另请参阅

适用于

产品 Introduced

GroupBy<TSource,TKey>(IEnumerable<TSource>, Func<TSource,TKey>)

根据指定的键选择器函数对序列中的元素进行分组。Groups the elements of a sequence according to a specified key selector function.

public:
generic <typename TSource, typename TKey>
[System::Runtime::CompilerServices::Extension]
 static System::Collections::Generic::IEnumerable<System::Linq::IGrouping<TKey, TSource> ^> ^ GroupBy(System::Collections::Generic::IEnumerable<TSource> ^ source, Func<TSource, TKey> ^ keySelector);
public static System.Collections.Generic.IEnumerable<System.Linq.IGrouping<TKey,TSource>> GroupBy<TSource,TKey> (this System.Collections.Generic.IEnumerable<TSource> source, Func<TSource,TKey> keySelector);
static member GroupBy : seq<'Source> * Func<'Source, 'Key> -> seq<System.Linq.IGrouping<'Key, 'Source>>
<Extension()>
Public Function GroupBy(Of TSource, TKey) (source As IEnumerable(Of TSource), keySelector As Func(Of TSource, TKey)) As IEnumerable(Of IGrouping(Of TKey, TSource))

类型参数

TSource

source 的元素类型。The type of the elements of source.

TKey

keySelector 返回的键的类型。The type of the key returned by keySelector.

参数

source
IEnumerable<TSource>

要对其元素进行分组的 IEnumerable<T>An IEnumerable<T> whose elements to group.

keySelector
Func<TSource,TKey>

用于提取每个元素的键的函数。A function to extract the key for each element.

返回

IEnumerable<IGrouping<TKey,TSource>>

C# 中的 IEnumerable<IGrouping<TKey, TSource>> 或 Visual Basic 中的 IEnumerable(Of IGrouping(Of TKey, TSource)),其中的每个 IGrouping<TKey,TElement> 对象均包含一个对象序列和键。An IEnumerable<IGrouping<TKey, TSource>> in C# or IEnumerable(Of IGrouping(Of TKey, TSource)) in Visual Basic where each IGrouping<TKey,TElement> object contains a sequence of objects and a key.

例外

sourcekeySelectornullsource or keySelector is null.

注解

此方法是使用延迟执行实现的。This method is implemented by using deferred execution. 即时返回值是一个对象,该对象存储执行操作所需的所有信息。The immediate return value is an object that stores all the information that is required to perform the action. 此方法表示的查询在枚举对象之前不会执行,方法是直接调用其 GetEnumerator 方法,或者通过 foreach 在 Visual c # 中使用或 For Each 在 Visual Basic 中使用。The query represented by this method is not executed until the object is enumerated either by calling its GetEnumerator method directly or by using foreach in Visual C# or For Each in Visual Basic.

GroupBy<TSource,TKey>(IEnumerable<TSource>, Func<TSource,TKey>)方法返回对象的集合 IGrouping<TKey,TElement> ,每个对象对应于遇到的每个非重复键。The GroupBy<TSource,TKey>(IEnumerable<TSource>, Func<TSource,TKey>) method returns a collection of IGrouping<TKey,TElement> objects, one for each distinct key that was encountered. IGrouping<TKey,TElement>是一个 IEnumerable<T> ,它还具有与其元素关联的键。An IGrouping<TKey,TElement> is an IEnumerable<T> that also has a key associated with its elements.

IGrouping<TKey,TElement>根据 source 生成每个对象的第一个键的中的元素的顺序,按顺序生成对象 IGrouping<TKey,TElement>The IGrouping<TKey,TElement> objects are yielded in an order based on the order of the elements in source that produced the first key of each IGrouping<TKey,TElement>. 分组中的元素将按它们出现的顺序生成 sourceElements in a grouping are yielded in the order they appear in source.

使用默认的相等比较器 Default 对键进行比较。The default equality comparer Default is used to compare keys.

在查询表达式语法中, group by (Visual c # ) 或 Group By Into (Visual Basic) 子句转换为对的调用 GroupByIn query expression syntax, a group by (Visual C#) or Group By Into (Visual Basic) clause translates to an invocation of GroupBy. 有关详细信息和用法示例,请参阅 group 子句group by 子句For more information and usage examples, see group clause and Group By Clause.

另请参阅

适用于

产品 Introduced

GroupBy<TSource,TKey>(IEnumerable<TSource>, Func<TSource,TKey>, IEqualityComparer<TKey>)

根据指定的键选择器函数对序列中的元素进行分组,并使用指定的比较器对键进行比较。Groups the elements of a sequence according to a specified key selector function and compares the keys by using a specified comparer.

public:
generic <typename TSource, typename TKey>
[System::Runtime::CompilerServices::Extension]
 static System::Collections::Generic::IEnumerable<System::Linq::IGrouping<TKey, TSource> ^> ^ GroupBy(System::Collections::Generic::IEnumerable<TSource> ^ source, Func<TSource, TKey> ^ keySelector, System::Collections::Generic::IEqualityComparer<TKey> ^ comparer);
public static System.Collections.Generic.IEnumerable<System.Linq.IGrouping<TKey,TSource>> GroupBy<TSource,TKey> (this System.Collections.Generic.IEnumerable<TSource> source, Func<TSource,TKey> keySelector, System.Collections.Generic.IEqualityComparer<TKey> comparer);
public static System.Collections.Generic.IEnumerable<System.Linq.IGrouping<TKey,TSource>> GroupBy<TSource,TKey> (this System.Collections.Generic.IEnumerable<TSource> source, Func<TSource,TKey> keySelector, System.Collections.Generic.IEqualityComparer<TKey>? comparer);
static member GroupBy : seq<'Source> * Func<'Source, 'Key> * System.Collections.Generic.IEqualityComparer<'Key> -> seq<System.Linq.IGrouping<'Key, 'Source>>
<Extension()>
Public Function GroupBy(Of TSource, TKey) (source As IEnumerable(Of TSource), keySelector As Func(Of TSource, TKey), comparer As IEqualityComparer(Of TKey)) As IEnumerable(Of IGrouping(Of TKey, TSource))

类型参数

TSource

source 的元素类型。The type of the elements of source.

TKey

keySelector 返回的键的类型。The type of the key returned by keySelector.

参数

source
IEnumerable<TSource>

要对其元素进行分组的 IEnumerable<T>An IEnumerable<T> whose elements to group.

keySelector
Func<TSource,TKey>

用于提取每个元素的键的函数。A function to extract the key for each element.

comparer
IEqualityComparer<TKey>

用于比较键的 IEqualityComparer<T>An IEqualityComparer<T> to compare keys.

返回

IEnumerable<IGrouping<TKey,TSource>>

C# 中的 IEnumerable<IGrouping<TKey, TSource>> 或 Visual Basic 中的 IEnumerable(Of IGrouping(Of TKey, TSource)),其中的每个 IGrouping<TKey,TElement> 对象均包含一个对象集合和键。An IEnumerable<IGrouping<TKey, TSource>> in C# or IEnumerable(Of IGrouping(Of TKey, TSource)) in Visual Basic where each IGrouping<TKey,TElement> object contains a collection of objects and a key.

例外

sourcekeySelectornullsource or keySelector is null.

注解

此方法是使用延迟执行实现的。This method is implemented by using deferred execution. 即时返回值是一个对象,该对象存储执行操作所需的所有信息。The immediate return value is an object that stores all the information that is required to perform the action. 此方法表示的查询在枚举对象之前不会执行,方法是直接调用其 GetEnumerator 方法,或者通过 foreach 在 Visual c # 中使用或 For Each 在 Visual Basic 中使用。The query represented by this method is not executed until the object is enumerated either by calling its GetEnumerator method directly or by using foreach in Visual C# or For Each in Visual Basic.

GroupBy<TSource,TKey>(IEnumerable<TSource>, Func<TSource,TKey>, IEqualityComparer<TKey>)方法返回对象的集合 IGrouping<TKey,TElement> ,每个对象对应于遇到的每个非重复键。The GroupBy<TSource,TKey>(IEnumerable<TSource>, Func<TSource,TKey>, IEqualityComparer<TKey>) method returns a collection of IGrouping<TKey,TElement> objects, one for each distinct key that was encountered. IGrouping<TKey,TElement>是一个 IEnumerable<T> ,它还具有与其元素关联的键。An IGrouping<TKey,TElement> is an IEnumerable<T> that also has a key associated with its elements.

IGrouping<TKey,TElement>根据 source 生成每个对象的第一个键的中的元素的顺序,按顺序生成对象 IGrouping<TKey,TElement>The IGrouping<TKey,TElement> objects are yielded in an order based on the order of the elements in source that produced the first key of each IGrouping<TKey,TElement>. 分组中的元素将按它们出现的顺序生成 sourceElements in a grouping are yielded in the order they appear in source.

如果 comparernull ,则使用默认的相等比较器 Default 对键进行比较。If comparer is null, the default equality comparer Default is used to compare keys.

如果根据,两个键被视为相等 comparer ,则选择第一个键作为该分组的键。If two keys are considered equal according to comparer, the first key is chosen as the key for that grouping.

在查询表达式语法中, group by (Visual c # ) 或 Group By Into (Visual Basic) 子句转换为对的调用 GroupByIn query expression syntax, a group by (Visual C#) or Group By Into (Visual Basic) clause translates to an invocation of GroupBy. 有关详细信息和用法示例,请参阅 group 子句group by 子句For more information and usage examples, see group clause and Group By Clause.

另请参阅

适用于

产品 Introduced