Поделиться через


Enumerable.GroupBy Метод

Определение

Группирует элементы последовательности.

Перегрузки

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

Группирует элементы последовательности в соответствии с заданной функцией селектора ключа и создает результирующее значение для каждой группы и ее ключа. Элементы каждой группы проецируются с помощью указанной функции.

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

Группирует элементы последовательности в соответствии с заданной функцией селектора ключа и создает результирующее значение для каждой группы и ее ключа. Значения ключей сравниваются с помощью указанного компаратора, элементы каждой группы проецируются с помощью указанной функции.

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

Группирует элементы последовательности в соответствии с заданной функцией селектора ключа и проецирует элементы каждой группы с помощью указанной функции.

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

Группирует элементы последовательности в соответствии с функцией селектора ключа. Ключи сравниваются с помощью компаратора, элементы каждой группы проецируются с помощью указанной функции.

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

Группирует элементы последовательности в соответствии с заданной функцией селектора ключа и создает результирующее значение для каждой группы и ее ключа.

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

Группирует элементы последовательности в соответствии с заданной функцией селектора ключа и создает результирующее значение для каждой группы и ее ключа. Ключи сравниваются с использованием заданного компаратора.

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

Группирует элементы последовательности в соответствии с заданной функцией селектора ключа.

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

Группирует элементы последовательности в соответствии с заданной функцией селектора ключа и сравнивает ключи с помощью указанного компаратора.

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

Исходный код:
Grouping.cs
Исходный код:
Grouping.cs
Исходный код:
Grouping.cs

Группирует элементы последовательности в соответствии с заданной функцией селектора ключа и создает результирующее значение для каждой группы и ее ключа. Элементы каждой группы проецируются с помощью указанной функции.

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.

TKey

Тип ключа, возвращаемого функцией keySelector.

TElement

Тип элементов каждого объекта IGrouping<TKey,TElement>.

TResult

Тип результирующего значения, возвращаемого функцией resultSelector.

Параметры

source
IEnumerable<TSource>

Объект IEnumerable<T>, элементы которого следует сгруппировать.

keySelector
Func<TSource,TKey>

Функция, извлекающая ключ для каждого элемента.

elementSelector
Func<TSource,TElement>

Функция, сопоставляющая каждый исходный элемент с элементом объекта IGrouping<TKey,TElement>.

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

Функция для создания результирующего значения для каждой группы.

Возвращаемое значение

IEnumerable<TResult>

Коллекция элементов типа TResult, в которой каждый элемент представляет проекцию группы и ее ключа.

Исключения

Значение параметра source или keySelector или elementSelector или resultSelectornull.

Примеры

В следующем примере кода показано, как с помощью GroupBy<TSource,TKey,TElement,TResult>(IEnumerable<TSource>, Func<TSource,TKey>, Func<TSource,TElement>, Func<TKey,IEnumerable<TElement>,TResult>) сгруппировать проецируемые элементы последовательности, а затем проецировать последовательность результатов типа 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 byGroupByзапроса предложение (C#) или Group By Into (Visual Basic) преобразуется в вызов .

См. также раздел

Применяется к

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

Исходный код:
Grouping.cs
Исходный код:
Grouping.cs
Исходный код:
Grouping.cs

Группирует элементы последовательности в соответствии с заданной функцией селектора ключа и создает результирующее значение для каждой группы и ее ключа. Значения ключей сравниваются с помощью указанного компаратора, элементы каждой группы проецируются с помощью указанной функции.

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.

TKey

Тип ключа, возвращаемого функцией keySelector.

TElement

Тип элементов каждого объекта IGrouping<TKey,TElement>.

TResult

Тип результирующего значения, возвращаемого функцией resultSelector.

Параметры

source
IEnumerable<TSource>

Объект IEnumerable<T>, элементы которого следует сгруппировать.

keySelector
Func<TSource,TKey>

Функция, извлекающая ключ для каждого элемента.

elementSelector
Func<TSource,TElement>

Функция, сопоставляющая каждый исходный элемент с элементом объекта IGrouping<TKey,TElement>.

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

Функция для создания результирующего значения для каждой группы.

comparer
IEqualityComparer<TKey>

Компаратор IEqualityComparer<T>, используемый для сравнения ключей.

Возвращаемое значение

IEnumerable<TResult>

Коллекция элементов типа TResult, в которой каждый элемент представляет проекцию группы и ее ключа.

Исключения

Значение параметра source или keySelector или elementSelector или resultSelectornull.

См. также раздел

Применяется к

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

Исходный код:
Grouping.cs
Исходный код:
Grouping.cs
Исходный код:
Grouping.cs

Группирует элементы последовательности в соответствии с заданной функцией селектора ключа и проецирует элементы каждой группы с помощью указанной функции.

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.

TKey

Тип ключа, возвращаемого функцией keySelector.

TElement

Тип элементов в IGrouping<TKey,TElement>.

Параметры

source
IEnumerable<TSource>

Объект IEnumerable<T>, элементы которого следует сгруппировать.

keySelector
Func<TSource,TKey>

Функция, извлекающая ключ для каждого элемента.

elementSelector
Func<TSource,TElement>

Функция, сопоставляющая каждый исходный элемент с элементом объекта IGrouping<TKey,TElement>.

Возвращаемое значение

IEnumerable<IGrouping<TKey,TElement>>

В IEnumerable<IGrouping<TKey, TElement>> C# или IEnumerable(Of IGrouping(Of TKey, TElement)) Visual Basic, где каждый IGrouping<TKey,TElement> объект содержит коллекцию объектов типа TElement и ключ.

Исключения

Параметр source, keySelector или elementSelector имеет значение null.

Примеры

В следующем примере кода показано, как использовать GroupBy<TSource,TKey,TElement>(IEnumerable<TSource>, Func<TSource,TKey>, Func<TSource,TElement>) для группировки элементов последовательности.

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 byGroupByзапроса предложение (C#) или Group By Into (Visual Basic) преобразуется в вызов . Преобразование выражения запроса в следующем примере эквивалентно приведенному выше запросу.

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

Примечание

В выражении запроса C# или Visual Basic выражения выбора элементов и ключей выполняются в обратном порядке от их позиций аргументов при вызове GroupBy<TSource,TKey,TElement>(IEnumerable<TSource>, Func<TSource,TKey>, Func<TSource,TElement>) метода .

Комментарии

Этот метод реализуется с помощью отложенного выполнения. Немедленно возвращаемое значение — это объект, в котором хранятся все сведения, необходимые для выполнения действия. Запрос, представленный этим методом, не выполняется до тех пор, пока объект не будет перечислен либо путем вызова его GetEnumerator метода напрямую, либо с помощью foreach в C# или For Each в Visual Basic.

Метод GroupBy<TSource,TKey,TElement>(IEnumerable<TSource>, Func<TSource,TKey>, Func<TSource,TElement>) возвращает коллекцию IGrouping<TKey,TElement> объектов , по одному для каждого обнаруженного ключа. — IGrouping<TKey,TElement> это объект IEnumerable<T> , который также имеет ключ, связанный с его элементами.

Объекты IGrouping<TKey,TElement> возвращаются в порядке, основанном на порядке элементов в source , в которых был создан первый ключ каждого IGrouping<TKey,TElement>. Элементы в группировке возвращаются в том порядке, в который элементы, создающие их, отображаются в source.

Для сравнения ключей используется компаратор Default равенства по умолчанию.

См. также раздел

Применяется к

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

Исходный код:
Grouping.cs
Исходный код:
Grouping.cs
Исходный код:
Grouping.cs

Группирует элементы последовательности в соответствии с функцией селектора ключа. Ключи сравниваются с помощью компаратора, элементы каждой группы проецируются с помощью указанной функции.

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.

TKey

Тип ключа, возвращаемого функцией keySelector.

TElement

Тип элементов в IGrouping<TKey,TElement>.

Параметры

source
IEnumerable<TSource>

Объект IEnumerable<T>, элементы которого следует сгруппировать.

keySelector
Func<TSource,TKey>

Функция, извлекающая ключ для каждого элемента.

elementSelector
Func<TSource,TElement>

Функция, сопоставляющая каждый исходный элемент с элементом объекта IGrouping<TKey,TElement>.

comparer
IEqualityComparer<TKey>

Компаратор IEqualityComparer<T>, используемый для сравнения ключей.

Возвращаемое значение

IEnumerable<IGrouping<TKey,TElement>>

В IEnumerable<IGrouping<TKey, TElement>> C# или IEnumerable(Of IGrouping(Of TKey, TElement)) в Visual Basic, где каждый IGrouping<TKey,TElement> объект содержит коллекцию объектов типа TElement и ключ.

Исключения

Параметр source, keySelector или elementSelector имеет значение null.

Комментарии

Этот метод реализуется с помощью отложенного выполнения. Немедленно возвращаемое значение — это объект, в котором хранятся все сведения, необходимые для выполнения действия. Запрос, представленный этим методом, не выполняется до тех пор, пока объект не будет перечислен либо путем вызова его GetEnumerator метода напрямую, либо с помощью foreach в C# или For Each в Visual Basic.

Метод GroupBy<TSource,TKey,TElement>(IEnumerable<TSource>, Func<TSource,TKey>, Func<TSource,TElement>, IEqualityComparer<TKey>) возвращает коллекцию IGrouping<TKey,TElement> объектов , по одному для каждого обнаруженного ключа. — IGrouping<TKey,TElement> это объект IEnumerable<T> , который также имеет ключ, связанный с его элементами.

Объекты IGrouping<TKey,TElement> возвращаются в порядке, основанном на порядке элементов в source , в которых был создан первый ключ каждого IGrouping<TKey,TElement>. Элементы в группировке возвращаются в том порядке, в который элементы, создающие их, отображаются в source.

Если comparer имеет значение null, для сравнения ключей используется компаратор Default равенства по умолчанию.

Если два ключа считаются равными в соответствии с comparer, первый ключ выбирается в качестве ключа для этой группировки.

В синтаксисе выражений group byGroupByзапроса предложение (C#) или Group By Into (Visual Basic) преобразуется в вызов . Дополнительные сведения и примеры использования см. в разделах Предложение group и Group By Clause.

См. также раздел

Применяется к

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

Исходный код:
Grouping.cs
Исходный код:
Grouping.cs
Исходный код:
Grouping.cs

Группирует элементы последовательности в соответствии с заданной функцией селектора ключа и создает результирующее значение для каждой группы и ее ключа.

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.

TKey

Тип ключа, возвращаемого функцией keySelector.

TResult

Тип результирующего значения, возвращаемого функцией resultSelector.

Параметры

source
IEnumerable<TSource>

Объект IEnumerable<T>, элементы которого следует сгруппировать.

keySelector
Func<TSource,TKey>

Функция, извлекающая ключ для каждого элемента.

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

Функция для создания результирующего значения для каждой группы.

Возвращаемое значение

IEnumerable<TResult>

Коллекция элементов типа TResult, в которой каждый элемент представляет проекцию группы и ее ключа.

Исключения

Параметр source, keySelector или resultSelector имеет значение null.

Примеры

В следующем примере кода показано, как использовать для GroupBy<TSource,TKey,TResult>(IEnumerable<TSource>, Func<TSource,TKey>, Func<TKey,IEnumerable<TSource>,TResult>) группировки элементов последовательности и проецирования последовательности результатов типа 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 выражения запроса предложение (C#) или Group By Into (Visual Basic) преобразуется в вызов GroupBy.

См. также раздел

Применяется к

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

Исходный код:
Grouping.cs
Исходный код:
Grouping.cs
Исходный код:
Grouping.cs

Группирует элементы последовательности в соответствии с заданной функцией селектора ключа и создает результирующее значение для каждой группы и ее ключа. Ключи сравниваются с использованием заданного компаратора.

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.

TKey

Тип ключа, возвращаемого функцией keySelector.

TResult

Тип результирующего значения, возвращаемого функцией resultSelector.

Параметры

source
IEnumerable<TSource>

Объект IEnumerable<T>, элементы которого следует сгруппировать.

keySelector
Func<TSource,TKey>

Функция, извлекающая ключ для каждого элемента.

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

Функция для создания результирующего значения для каждой группы.

comparer
IEqualityComparer<TKey>

Компаратор IEqualityComparer<T>, используемый для сравнения ключей.

Возвращаемое значение

IEnumerable<TResult>

Коллекция элементов типа TResult, в которой каждый элемент представляет проекцию группы и ее ключа.

Исключения

Параметр source, keySelector или resultSelector имеет значение null.

См. также раздел

Применяется к

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

Исходный код:
Grouping.cs
Исходный код:
Grouping.cs
Исходный код:
Grouping.cs

Группирует элементы последовательности в соответствии с заданной функцией селектора ключа.

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.

TKey

Тип ключа, возвращаемого функцией keySelector.

Параметры

source
IEnumerable<TSource>

Объект IEnumerable<T>, элементы которого следует сгруппировать.

keySelector
Func<TSource,TKey>

Функция, извлекающая ключ для каждого элемента.

Возвращаемое значение

IEnumerable<IGrouping<TKey,TSource>>

В IEnumerable<IGrouping<TKey, TSource>> C# или IEnumerable(Of IGrouping(Of TKey, TSource)) в Visual Basic, где каждый IGrouping<TKey,TElement> объект содержит последовательность объектов и ключ.

Исключения

Параметр source или keySelector имеет значение null.

Комментарии

Этот метод реализуется с помощью отложенного выполнения. Немедленное возвращаемое значение — это объект, в котором хранятся все сведения, необходимые для выполнения действия. Запрос, представленный этим методом, не выполняется, пока объект не будет перечислен либо путем вызова его GetEnumerator метода напрямую, либо с помощью foreach в C# или For Each в Visual Basic.

Метод GroupBy<TSource,TKey>(IEnumerable<TSource>, Func<TSource,TKey>) возвращает коллекцию IGrouping<TKey,TElement> объектов , по одному для каждого обнаруженного ключа. — IGrouping<TKey,TElement> это объект IEnumerable<T> , который также имеет ключ, связанный с его элементами.

Объекты IGrouping<TKey,TElement> возвращаются в порядке, основанном на порядке элементов в source , которые создали первый ключ каждого IGrouping<TKey,TElement>. Элементы в группировке возвращаются в том порядке, в который они отображаются в source.

Для сравнения ключей используется компаратор Default на равенство по умолчанию.

В синтаксисе group by выражения запроса предложение (C#) или Group By Into (Visual Basic) преобразуется в вызов GroupBy. Дополнительные сведения и примеры использования см. в разделах Предложение group и Предложение Group By.

См. также раздел

Применяется к

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

Исходный код:
Grouping.cs
Исходный код:
Grouping.cs
Исходный код:
Grouping.cs

Группирует элементы последовательности в соответствии с заданной функцией селектора ключа и сравнивает ключи с помощью указанного компаратора.

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.

TKey

Тип ключа, возвращаемого функцией keySelector.

Параметры

source
IEnumerable<TSource>

Объект IEnumerable<T>, элементы которого следует сгруппировать.

keySelector
Func<TSource,TKey>

Функция, извлекающая ключ для каждого элемента.

comparer
IEqualityComparer<TKey>

Компаратор IEqualityComparer<T>, используемый для сравнения ключей.

Возвращаемое значение

IEnumerable<IGrouping<TKey,TSource>>

В IEnumerable<IGrouping<TKey, TSource>> C# или IEnumerable(Of IGrouping(Of TKey, TSource)) в Visual Basic, где каждый IGrouping<TKey,TElement> объект содержит коллекцию объектов и ключ.

Исключения

Параметр source или keySelector имеет значение null.

Комментарии

Этот метод реализуется с помощью отложенного выполнения. Немедленное возвращаемое значение — это объект, в котором хранятся все сведения, необходимые для выполнения действия. Запрос, представленный этим методом, не выполняется, пока объект не будет перечислен либо путем вызова его GetEnumerator метода напрямую, либо с помощью foreach в C# или For Each в Visual Basic.

Метод GroupBy<TSource,TKey>(IEnumerable<TSource>, Func<TSource,TKey>, IEqualityComparer<TKey>) возвращает коллекцию IGrouping<TKey,TElement> объектов , по одному для каждого обнаруженного ключа. — IGrouping<TKey,TElement> это объект IEnumerable<T> , который также имеет ключ, связанный с его элементами.

Объекты IGrouping<TKey,TElement> возвращаются в порядке, основанном на порядке элементов в source , которые создали первый ключ каждого IGrouping<TKey,TElement>. Элементы в группировке возвращаются в том порядке, в который они отображаются в source.

Если comparer имеет значение null, для сравнения ключей используется компаратор Default на равенство по умолчанию.

Если два ключа считаются равными в соответствии с comparer, первый ключ выбирается в качестве ключа для этой группировки.

В синтаксисе group by выражения запроса предложение (C#) или Group By Into (Visual Basic) преобразуется в вызов GroupBy. Дополнительные сведения и примеры использования см. в разделах Предложение group и Предложение Group By.

См. также раздел

Применяется к