Queryable.GroupBy Method
Definition
Important
Some information relates to prerelease product that may be substantially modified before it’s released. Microsoft makes no warranties, express or implied, with respect to the information provided here.
Groups the elements of a sequence.
Overloads
GroupBy<TSource,TKey,TElement,TResult>(IQueryable<TSource>, Expression<Func<TSource, TKey>>, Expression<Func<TSource,TElement>>, Expression<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. Keys are compared by using a specified comparer and the elements of each group are projected by using a specified function. |
GroupBy<TSource,TKey,TElement,TResult>(IQueryable<TSource>, Expression<Func<TSource, TKey>>, Expression<Func<TSource,TElement>>, Expression<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>(IQueryable<TSource>, Expression<Func<TSource,TKey>>, Expression<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>(IQueryable<TSource>, Expression<Func<TSource,TKey>>, Expression<Func<TSource,TElement>>, IEqualityComparer<TKey>) |
Groups the elements of a sequence and projects the elements for each group by using a specified function. Key values are compared by using a specified comparer. |
GroupBy<TSource,TKey,TResult>(IQueryable<TSource>, Expression<Func<TSource,TKey>>, Expression<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>(IQueryable<TSource>, Expression<Func<TSource, TKey>>, Expression<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. Keys are compared by using a specified comparer. |
GroupBy<TSource,TKey>(IQueryable<TSource>, Expression<Func<TSource,TKey>>) |
Groups the elements of a sequence according to a specified key selector function. |
GroupBy<TSource,TKey>(IQueryable<TSource>, Expression<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>(IQueryable<TSource>, Expression<Func<TSource, TKey>>, Expression<Func<TSource,TElement>>, Expression<Func<TKey, IEnumerable<TElement>,TResult>>, IEqualityComparer<TKey>)
- Source:
- Queryable.cs
- Source:
- Queryable.cs
- Source:
- Queryable.cs
Groups the elements of a sequence according to a specified key selector function and creates a result value from each group and its key. Keys 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::Linq::IQueryable<TResult> ^ GroupBy(System::Linq::IQueryable<TSource> ^ source, System::Linq::Expressions::Expression<Func<TSource, TKey> ^> ^ keySelector, System::Linq::Expressions::Expression<Func<TSource, TElement> ^> ^ elementSelector, System::Linq::Expressions::Expression<Func<TKey, System::Collections::Generic::IEnumerable<TElement> ^, TResult> ^> ^ resultSelector, System::Collections::Generic::IEqualityComparer<TKey> ^ comparer);
public static System.Linq.IQueryable<TResult> GroupBy<TSource,TKey,TElement,TResult> (this System.Linq.IQueryable<TSource> source, System.Linq.Expressions.Expression<Func<TSource,TKey>> keySelector, System.Linq.Expressions.Expression<Func<TSource,TElement>> elementSelector, System.Linq.Expressions.Expression<Func<TKey,System.Collections.Generic.IEnumerable<TElement>,TResult>> resultSelector, System.Collections.Generic.IEqualityComparer<TKey> comparer);
public static System.Linq.IQueryable<TResult> GroupBy<TSource,TKey,TElement,TResult> (this System.Linq.IQueryable<TSource> source, System.Linq.Expressions.Expression<Func<TSource,TKey>> keySelector, System.Linq.Expressions.Expression<Func<TSource,TElement>> elementSelector, System.Linq.Expressions.Expression<Func<TKey,System.Collections.Generic.IEnumerable<TElement>,TResult>> resultSelector, System.Collections.Generic.IEqualityComparer<TKey>? comparer);
static member GroupBy : System.Linq.IQueryable<'Source> * System.Linq.Expressions.Expression<Func<'Source, 'Key>> * System.Linq.Expressions.Expression<Func<'Source, 'Element>> * System.Linq.Expressions.Expression<Func<'Key, seq<'Element>, 'Result>> * System.Collections.Generic.IEqualityComparer<'Key> -> System.Linq.IQueryable<'Result>
<Extension()>
Public Function GroupBy(Of TSource, TKey, TElement, TResult) (source As IQueryable(Of TSource), keySelector As Expression(Of Func(Of TSource, TKey)), elementSelector As Expression(Of Func(Of TSource, TElement)), resultSelector As Expression(Of Func(Of TKey, IEnumerable(Of TElement), TResult)), comparer As IEqualityComparer(Of TKey)) As IQueryable(Of TResult)
Type Parameters
- TSource
The type of the elements of source
.
- TKey
The type of the key returned by the function represented in keySelector
.
- TElement
The type of the elements in each IGrouping<TKey,TElement>.
- TResult
The type of the result value returned by resultSelector
.
Parameters
- source
- IQueryable<TSource>
An IQueryable<T> whose elements to group.
- keySelector
- Expression<Func<TSource,TKey>>
A function to extract the key for each element.
- elementSelector
- Expression<Func<TSource,TElement>>
A function to map each source element to an element in an IGrouping<TKey,TElement>.
- resultSelector
- Expression<Func<TKey,IEnumerable<TElement>,TResult>>
A function to create a result value from each group.
- comparer
- IEqualityComparer<TKey>
An IEqualityComparer<T> to compare keys.
Returns
An T:System.Linq.IQueryable`1
that has a type argument of TResult
and where each element represents a projection over a group and its key.
Exceptions
source
or keySelector
or elementSelector
or resultSelector
or comparer
is null
.
Remarks
This method has at least one parameter of type Expression<TDelegate> whose type argument is one of the Func<T,TResult> types. For these parameters, you can pass in a lambda expression and it will be compiled to an Expression<TDelegate>.
The GroupBy<TSource,TKey,TElement,TResult>(IQueryable<TSource>, Expression<Func<TSource,
TKey>>, Expression<Func<TSource,TElement>>, Expression<Func<TKey,
IEnumerable<TElement>,TResult>>, IEqualityComparer<TKey>) method generates a MethodCallExpression that represents calling GroupBy<TSource,TKey,TElement,TResult>(IQueryable<TSource>, Expression<Func<TSource,
TKey>>, Expression<Func<TSource,TElement>>, Expression<Func<TKey,
IEnumerable<TElement>,TResult>>, IEqualityComparer<TKey>) itself as a constructed generic method. It then passes the MethodCallExpression to the CreateQuery<TElement>(Expression) method of the IQueryProvider represented by the Provider property of the source
parameter.
The query behavior that occurs as a result of executing an expression tree that represents calling GroupBy<TSource,TKey,TElement,TResult>(IQueryable<TSource>, Expression<Func<TSource,
TKey>>, Expression<Func<TSource,TElement>>, Expression<Func<TKey,
IEnumerable<TElement>,TResult>>, IEqualityComparer<TKey>) depends on the implementation of the type of the source
parameter. The expected behavior is that it groups the elements of source
by key values that are obtained by invoking keySelector
on each element. The comparer
parameter is used to compare key values. The elementSelector
parameter is used to project the elements of each group, and the resultSelector
parameter is used to obtain a result value from each group and its key.
Applies to
GroupBy<TSource,TKey,TElement,TResult>(IQueryable<TSource>, Expression<Func<TSource, TKey>>, Expression<Func<TSource,TElement>>, Expression<Func<TKey, IEnumerable<TElement>,TResult>>)
- Source:
- Queryable.cs
- Source:
- Queryable.cs
- Source:
- Queryable.cs
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::Linq::IQueryable<TResult> ^ GroupBy(System::Linq::IQueryable<TSource> ^ source, System::Linq::Expressions::Expression<Func<TSource, TKey> ^> ^ keySelector, System::Linq::Expressions::Expression<Func<TSource, TElement> ^> ^ elementSelector, System::Linq::Expressions::Expression<Func<TKey, System::Collections::Generic::IEnumerable<TElement> ^, TResult> ^> ^ resultSelector);
public static System.Linq.IQueryable<TResult> GroupBy<TSource,TKey,TElement,TResult> (this System.Linq.IQueryable<TSource> source, System.Linq.Expressions.Expression<Func<TSource,TKey>> keySelector, System.Linq.Expressions.Expression<Func<TSource,TElement>> elementSelector, System.Linq.Expressions.Expression<Func<TKey,System.Collections.Generic.IEnumerable<TElement>,TResult>> resultSelector);
static member GroupBy : System.Linq.IQueryable<'Source> * System.Linq.Expressions.Expression<Func<'Source, 'Key>> * System.Linq.Expressions.Expression<Func<'Source, 'Element>> * System.Linq.Expressions.Expression<Func<'Key, seq<'Element>, 'Result>> -> System.Linq.IQueryable<'Result>
<Extension()>
Public Function GroupBy(Of TSource, TKey, TElement, TResult) (source As IQueryable(Of TSource), keySelector As Expression(Of Func(Of TSource, TKey)), elementSelector As Expression(Of Func(Of TSource, TElement)), resultSelector As Expression(Of Func(Of TKey, IEnumerable(Of TElement), TResult))) As IQueryable(Of TResult)
Type Parameters
- TSource
The type of the elements of source
.
- TKey
The type of the key returned by the function represented in keySelector
.
- TElement
The type of the elements in each IGrouping<TKey,TElement>.
- TResult
The type of the result value returned by resultSelector
.
Parameters
- source
- IQueryable<TSource>
An IQueryable<T> whose elements to group.
- keySelector
- Expression<Func<TSource,TKey>>
A function to extract the key for each element.
- elementSelector
- Expression<Func<TSource,TElement>>
A function to map each source element to an element in an IGrouping<TKey,TElement>.
- resultSelector
- Expression<Func<TKey,IEnumerable<TElement>,TResult>>
A function to create a result value from each group.
Returns
An T:System.Linq.IQueryable`1
that has a type argument of TResult
and where each element represents a projection over a group and its key.
Exceptions
source
or keySelector
or elementSelector
or resultSelector
is null
.
Examples
The following code example demonstrates how to use GroupBy<TSource,TKey,TElement,TResult>(IQueryable<TSource>, Expression<Func<TSource,
TKey>>, Expression<Func<TSource,TElement>>, Expression<Func<TKey,
IEnumerable<TElement>,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 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.AsQueryable().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
Shared 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 valuesby 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.AsQueryable().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 with this age: " & result.Count)
output.AppendLine("Minimum age: " & result.Min)
output.AppendLine("Maximum age: " & result.Max)
Next
' Display the output.
MsgBox(output.ToString())
' This code produces the following output:
' Age group: 8
' Number of pets with this age: 1
' Minimum age: 8.3
' Maximum age: 8.3
' Age group: 4
' Number of pets with this age: 2
' Minimum age: 4.3
' Maximum age: 4.9
' Age group: 1
' Number of pets with this age: 1
' Minimum age: 1.5
' Maximum age: 1.5
End Sub
Remarks
This method has at least one parameter of type Expression<TDelegate> whose type argument is one of the Func<T,TResult> types. For these parameters, you can pass in a lambda expression and it will be compiled to an Expression<TDelegate>.
The GroupBy<TSource,TKey,TElement,TResult>(IQueryable<TSource>, Expression<Func<TSource,
TKey>>, Expression<Func<TSource,TElement>>, Expression<Func<TKey,
IEnumerable<TElement>,TResult>>) method generates a MethodCallExpression that represents calling GroupBy<TSource,TKey,TElement,TResult>(IQueryable<TSource>, Expression<Func<TSource,
TKey>>, Expression<Func<TSource,TElement>>, Expression<Func<TKey,
IEnumerable<TElement>,TResult>>) itself as a constructed generic method. It then passes the MethodCallExpression to the CreateQuery<TElement>(Expression) method of the IQueryProvider represented by the Provider property of the source
parameter.
The query behavior that occurs as a result of executing an expression tree that represents calling GroupBy<TSource,TKey,TElement,TResult>(IQueryable<TSource>, Expression<Func<TSource,
TKey>>, Expression<Func<TSource,TElement>>, Expression<Func<TKey,
IEnumerable<TElement>,TResult>>) depends on the implementation of the type of the source
parameter. The expected behavior is that it groups the elements of source
by key values that are obtained by invoking keySelector
on each element. The elementSelector
parameter is used to project the elements of each group, and the resultSelector
parameter is used to obtain a result value from each group and its key.
Applies to
GroupBy<TSource,TKey,TElement>(IQueryable<TSource>, Expression<Func<TSource,TKey>>, Expression<Func<TSource,TElement>>)
- Source:
- Queryable.cs
- Source:
- Queryable.cs
- Source:
- Queryable.cs
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::Linq::IQueryable<System::Linq::IGrouping<TKey, TElement> ^> ^ GroupBy(System::Linq::IQueryable<TSource> ^ source, System::Linq::Expressions::Expression<Func<TSource, TKey> ^> ^ keySelector, System::Linq::Expressions::Expression<Func<TSource, TElement> ^> ^ elementSelector);
public static System.Linq.IQueryable<System.Linq.IGrouping<TKey,TElement>> GroupBy<TSource,TKey,TElement> (this System.Linq.IQueryable<TSource> source, System.Linq.Expressions.Expression<Func<TSource,TKey>> keySelector, System.Linq.Expressions.Expression<Func<TSource,TElement>> elementSelector);
static member GroupBy : System.Linq.IQueryable<'Source> * System.Linq.Expressions.Expression<Func<'Source, 'Key>> * System.Linq.Expressions.Expression<Func<'Source, 'Element>> -> System.Linq.IQueryable<System.Linq.IGrouping<'Key, 'Element>>
<Extension()>
Public Function GroupBy(Of TSource, TKey, TElement) (source As IQueryable(Of TSource), keySelector As Expression(Of Func(Of TSource, TKey)), elementSelector As Expression(Of Func(Of TSource, TElement))) As IQueryable(Of IGrouping(Of TKey, TElement))
Type Parameters
- TSource
The type of the elements of source
.
- TKey
The type of the key returned by the function represented in keySelector
.
- TElement
The type of the elements in each IGrouping<TKey,TElement>.
Parameters
- source
- IQueryable<TSource>
An IQueryable<T> whose elements to group.
- keySelector
- Expression<Func<TSource,TKey>>
A function to extract the key for each element.
- elementSelector
- Expression<Func<TSource,TElement>>
A function to map each source element to an element in an IGrouping<TKey,TElement>.
Returns
An IQueryable<IGrouping<TKey, TElement>>
in C# or IQueryable(Of IGrouping(Of TKey, TElement))
in Visual Basic where each IGrouping<TKey,TElement> contains a sequence of objects of type TElement
and a key.
Exceptions
source
or keySelector
or elementSelector
is null
.
Examples
The following code example demonstrates how to use GroupBy<TSource,TKey,TElement>(IQueryable<TSource>, Expression<Func<TSource,TKey>>, Expression<Func<TSource,TElement>>) to group the elements of a sequence.
class Pet
{
public string Name { get; set; }
public int Age { get; set; }
}
public static void GroupByEx2()
{
// 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.
IEnumerable<IGrouping<int, string>> query =
pets.AsQueryable().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
Shared Sub GroupByEx2()
' 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 Pet.Age as the key.
' Use Pet.Name as the value for each entry.
Dim query As IEnumerable(Of IGrouping(Of Integer, String)) = _
pets.AsQueryable().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(String.Format(" {0}", name))
Next
Next
' Display the output.
MsgBox(output.ToString())
End Sub
' This code produces the following output:
'
' 8
' Barley
' 4
' Boots
' Daisy
' 1
' Whiskers
Remarks
This method has at least one parameter of type Expression<TDelegate> whose type argument is one of the Func<T,TResult> types. For these parameters, you can pass in a lambda expression and it will be compiled to an Expression<TDelegate>.
The GroupBy<TSource,TKey,TElement>(IQueryable<TSource>, Expression<Func<TSource,TKey>>, Expression<Func<TSource,TElement>>) method generates a MethodCallExpression that represents calling GroupBy<TSource,TKey,TElement>(IQueryable<TSource>, Expression<Func<TSource,TKey>>, Expression<Func<TSource,TElement>>) itself as a constructed generic method. It then passes the MethodCallExpression to the CreateQuery<TElement>(Expression) method of the IQueryProvider represented by the Provider property of the source
parameter.
The query behavior that occurs as a result of executing an expression tree that represents calling GroupBy<TSource,TKey,TElement>(IQueryable<TSource>, Expression<Func<TSource,TKey>>, Expression<Func<TSource,TElement>>) depends on the implementation of the type of the source
parameter. The expected behavior is that it groups the elements of source
by a key value that is obtained by invoking keySelector
on each element. It invokes elementSelector
on each element to obtain a result element.
Applies to
GroupBy<TSource,TKey,TElement>(IQueryable<TSource>, Expression<Func<TSource,TKey>>, Expression<Func<TSource,TElement>>, IEqualityComparer<TKey>)
- Source:
- Queryable.cs
- Source:
- Queryable.cs
- Source:
- Queryable.cs
Groups the elements of a sequence and projects the elements for each group by using a specified function. Key values are compared by using a specified comparer.
public:
generic <typename TSource, typename TKey, typename TElement>
[System::Runtime::CompilerServices::Extension]
static System::Linq::IQueryable<System::Linq::IGrouping<TKey, TElement> ^> ^ GroupBy(System::Linq::IQueryable<TSource> ^ source, System::Linq::Expressions::Expression<Func<TSource, TKey> ^> ^ keySelector, System::Linq::Expressions::Expression<Func<TSource, TElement> ^> ^ elementSelector, System::Collections::Generic::IEqualityComparer<TKey> ^ comparer);
public static System.Linq.IQueryable<System.Linq.IGrouping<TKey,TElement>> GroupBy<TSource,TKey,TElement> (this System.Linq.IQueryable<TSource> source, System.Linq.Expressions.Expression<Func<TSource,TKey>> keySelector, System.Linq.Expressions.Expression<Func<TSource,TElement>> elementSelector, System.Collections.Generic.IEqualityComparer<TKey> comparer);
public static System.Linq.IQueryable<System.Linq.IGrouping<TKey,TElement>> GroupBy<TSource,TKey,TElement> (this System.Linq.IQueryable<TSource> source, System.Linq.Expressions.Expression<Func<TSource,TKey>> keySelector, System.Linq.Expressions.Expression<Func<TSource,TElement>> elementSelector, System.Collections.Generic.IEqualityComparer<TKey>? comparer);
static member GroupBy : System.Linq.IQueryable<'Source> * System.Linq.Expressions.Expression<Func<'Source, 'Key>> * System.Linq.Expressions.Expression<Func<'Source, 'Element>> * System.Collections.Generic.IEqualityComparer<'Key> -> System.Linq.IQueryable<System.Linq.IGrouping<'Key, 'Element>>
<Extension()>
Public Function GroupBy(Of TSource, TKey, TElement) (source As IQueryable(Of TSource), keySelector As Expression(Of Func(Of TSource, TKey)), elementSelector As Expression(Of Func(Of TSource, TElement)), comparer As IEqualityComparer(Of TKey)) As IQueryable(Of IGrouping(Of TKey, TElement))
Type Parameters
- TSource
The type of the elements of source
.
- TKey
The type of the key returned by the function represented in keySelector
.
- TElement
The type of the elements in each IGrouping<TKey,TElement>.
Parameters
- source
- IQueryable<TSource>
An IQueryable<T> whose elements to group.
- keySelector
- Expression<Func<TSource,TKey>>
A function to extract the key for each element.
- elementSelector
- Expression<Func<TSource,TElement>>
A function to map each source element to an element in an IGrouping<TKey,TElement>.
- comparer
- IEqualityComparer<TKey>
An IEqualityComparer<T> to compare keys.
Returns
An IQueryable<IGrouping<TKey, TElement>>
in C# or IQueryable(Of IGrouping(Of TKey, TElement))
in Visual Basic where each IGrouping<TKey,TElement> contains a sequence of objects of type TElement
and a key.
Exceptions
source
or keySelector
or elementSelector
or comparer
is null
.
Remarks
This method has at least one parameter of type Expression<TDelegate> whose type argument is one of the Func<T,TResult> types. For these parameters, you can pass in a lambda expression and it will be compiled to an Expression<TDelegate>.
The GroupBy<TSource,TKey,TElement>(IQueryable<TSource>, Expression<Func<TSource,TKey>>, Expression<Func<TSource,TElement>>, IEqualityComparer<TKey>) method generates a MethodCallExpression that represents calling GroupBy<TSource,TKey,TElement>(IQueryable<TSource>, Expression<Func<TSource,TKey>>, Expression<Func<TSource,TElement>>, IEqualityComparer<TKey>) itself as a constructed generic method. It then passes the MethodCallExpression to the CreateQuery<TElement>(Expression) method of the IQueryProvider represented by the Provider property of the source
parameter.
The query behavior that occurs as a result of executing an expression tree that represents calling GroupBy<TSource,TKey,TElement>(IQueryable<TSource>, Expression<Func<TSource,TKey>>, Expression<Func<TSource,TElement>>, IEqualityComparer<TKey>) depends on the implementation of the type of the source
parameter. The expected behavior is that it groups the elements of source
by a key value that is obtained by invoking keySelector
on each element. Key values are compared by using comparer
. The elementSelector
parameter is invoked on each element to obtain a result element.
Applies to
GroupBy<TSource,TKey,TResult>(IQueryable<TSource>, Expression<Func<TSource,TKey>>, Expression<Func<TKey,IEnumerable<TSource>,TResult>>)
- Source:
- Queryable.cs
- Source:
- Queryable.cs
- Source:
- Queryable.cs
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::Linq::IQueryable<TResult> ^ GroupBy(System::Linq::IQueryable<TSource> ^ source, System::Linq::Expressions::Expression<Func<TSource, TKey> ^> ^ keySelector, System::Linq::Expressions::Expression<Func<TKey, System::Collections::Generic::IEnumerable<TSource> ^, TResult> ^> ^ resultSelector);
public static System.Linq.IQueryable<TResult> GroupBy<TSource,TKey,TResult> (this System.Linq.IQueryable<TSource> source, System.Linq.Expressions.Expression<Func<TSource,TKey>> keySelector, System.Linq.Expressions.Expression<Func<TKey,System.Collections.Generic.IEnumerable<TSource>,TResult>> resultSelector);
static member GroupBy : System.Linq.IQueryable<'Source> * System.Linq.Expressions.Expression<Func<'Source, 'Key>> * System.Linq.Expressions.Expression<Func<'Key, seq<'Source>, 'Result>> -> System.Linq.IQueryable<'Result>
<Extension()>
Public Function GroupBy(Of TSource, TKey, TResult) (source As IQueryable(Of TSource), keySelector As Expression(Of Func(Of TSource, TKey)), resultSelector As Expression(Of Func(Of TKey, IEnumerable(Of TSource), TResult))) As IQueryable(Of TResult)
Type Parameters
- TSource
The type of the elements of source
.
- TKey
The type of the key returned by the function represented in keySelector
.
- TResult
The type of the result value returned by resultSelector
.
Parameters
- source
- IQueryable<TSource>
An IQueryable<T> whose elements to group.
- keySelector
- Expression<Func<TSource,TKey>>
A function to extract the key for each element.
- resultSelector
- Expression<Func<TKey,IEnumerable<TSource>,TResult>>
A function to create a result value from each group.
Returns
An T:System.Linq.IQueryable`1
that has a type argument of TResult
and where each element represents a projection over a group and its key.
Exceptions
source
or keySelector
or resultSelector
is null
.
Examples
The following code example demonstrates how to use GroupBy<TSource,TKey,TResult>(IQueryable<TSource>, Expression<Func<TSource,TKey>>, Expression<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.AsQueryable().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
Shared 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.AsQueryable().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 with this age: " & result.Count)
output.AppendLine("Minimum age: " & result.Min)
output.AppendLine("Maximum age: " & result.Max)
Next
' Display the output.
MsgBox(output.ToString())
' This code produces the following output:
' Age group: 8
' Number of pets with this age: 1
' Minimum age: 8.3
' Maximum age: 8.3
' Age group: 4
' Number of pets with this age: 2
' Minimum age: 4.3
' Maximum age: 4.9
' Age group: 1
' Number of pets with this age: 1
' Minimum age: 1.5
' Maximum age: 1.5
End Sub
Remarks
This method has at least one parameter of type Expression<TDelegate> whose type argument is one of the Func<T,TResult> types. For these parameters, you can pass in a lambda expression and it will be compiled to an Expression<TDelegate>.
The GroupBy<TSource,TKey,TResult>(IQueryable<TSource>, Expression<Func<TSource,TKey>>, Expression<Func<TKey,IEnumerable<TSource>,TResult>>) method generates a MethodCallExpression that represents calling GroupBy<TSource,TKey,TResult>(IQueryable<TSource>, Expression<Func<TSource,TKey>>, Expression<Func<TKey,IEnumerable<TSource>,TResult>>) itself as a constructed generic method. It then passes the MethodCallExpression to the CreateQuery<TElement>(Expression) method of the IQueryProvider represented by the Provider property of the source
parameter.
The query behavior that occurs as a result of executing an expression tree that represents calling GroupBy<TSource,TKey,TResult>(IQueryable<TSource>, Expression<Func<TSource,TKey>>, Expression<Func<TKey,IEnumerable<TSource>,TResult>>) depends on the implementation of the type of the source
parameter. The expected behavior is that it groups the elements of source
by a key value that is obtained by invoking keySelector
on each element. The resultSelector
parameter is used to obtain a result value from each group and its key.
Applies to
GroupBy<TSource,TKey,TResult>(IQueryable<TSource>, Expression<Func<TSource, TKey>>, Expression<Func<TKey,IEnumerable<TSource>,TResult>>, IEqualityComparer<TKey>)
- Source:
- Queryable.cs
- Source:
- Queryable.cs
- Source:
- Queryable.cs
Groups the elements of a sequence according to a specified key selector function and creates a result value from each group and its key. Keys are compared by using a specified comparer.
public:
generic <typename TSource, typename TKey, typename TResult>
[System::Runtime::CompilerServices::Extension]
static System::Linq::IQueryable<TResult> ^ GroupBy(System::Linq::IQueryable<TSource> ^ source, System::Linq::Expressions::Expression<Func<TSource, TKey> ^> ^ keySelector, System::Linq::Expressions::Expression<Func<TKey, System::Collections::Generic::IEnumerable<TSource> ^, TResult> ^> ^ resultSelector, System::Collections::Generic::IEqualityComparer<TKey> ^ comparer);
public static System.Linq.IQueryable<TResult> GroupBy<TSource,TKey,TResult> (this System.Linq.IQueryable<TSource> source, System.Linq.Expressions.Expression<Func<TSource,TKey>> keySelector, System.Linq.Expressions.Expression<Func<TKey,System.Collections.Generic.IEnumerable<TSource>,TResult>> resultSelector, System.Collections.Generic.IEqualityComparer<TKey> comparer);
public static System.Linq.IQueryable<TResult> GroupBy<TSource,TKey,TResult> (this System.Linq.IQueryable<TSource> source, System.Linq.Expressions.Expression<Func<TSource,TKey>> keySelector, System.Linq.Expressions.Expression<Func<TKey,System.Collections.Generic.IEnumerable<TSource>,TResult>> resultSelector, System.Collections.Generic.IEqualityComparer<TKey>? comparer);
static member GroupBy : System.Linq.IQueryable<'Source> * System.Linq.Expressions.Expression<Func<'Source, 'Key>> * System.Linq.Expressions.Expression<Func<'Key, seq<'Source>, 'Result>> * System.Collections.Generic.IEqualityComparer<'Key> -> System.Linq.IQueryable<'Result>
<Extension()>
Public Function GroupBy(Of TSource, TKey, TResult) (source As IQueryable(Of TSource), keySelector As Expression(Of Func(Of TSource, TKey)), resultSelector As Expression(Of Func(Of TKey, IEnumerable(Of TSource), TResult)), comparer As IEqualityComparer(Of TKey)) As IQueryable(Of TResult)
Type Parameters
- TSource
The type of the elements of source
.
- TKey
The type of the key returned by the function represented in keySelector
.
- TResult
The type of the result value returned by resultSelector
.
Parameters
- source
- IQueryable<TSource>
An IQueryable<T> whose elements to group.
- keySelector
- Expression<Func<TSource,TKey>>
A function to extract the key for each element.
- resultSelector
- Expression<Func<TKey,IEnumerable<TSource>,TResult>>
A function to create a result value from each group.
- comparer
- IEqualityComparer<TKey>
An IEqualityComparer<T> to compare keys.
Returns
An T:System.Linq.IQueryable`1
that has a type argument of TResult
and where each element represents a projection over a group and its key.
Exceptions
source
or keySelector
or resultSelector
or comparer
is null
.
Remarks
This method has at least one parameter of type Expression<TDelegate> whose type argument is one of the Func<T,TResult> types. For these parameters, you can pass in a lambda expression and it will be compiled to an Expression<TDelegate>.
The GroupBy<TSource,TKey,TResult>(IQueryable<TSource>, Expression<Func<TSource,
TKey>>, Expression<Func<TKey,IEnumerable<TSource>,TResult>>, IEqualityComparer<TKey>) method generates a MethodCallExpression that represents calling GroupBy<TSource,TKey,TResult>(IQueryable<TSource>, Expression<Func<TSource,
TKey>>, Expression<Func<TKey,IEnumerable<TSource>,TResult>>, IEqualityComparer<TKey>) itself as a constructed generic method. It then passes the MethodCallExpression to the CreateQuery<TElement>(Expression) method of the IQueryProvider represented by the Provider property of the source
parameter.
The query behavior that occurs as a result of executing an expression tree that represents calling GroupBy<TSource,TKey,TResult>(IQueryable<TSource>, Expression<Func<TSource,
TKey>>, Expression<Func<TKey,IEnumerable<TSource>,TResult>>, IEqualityComparer<TKey>) depends on the implementation of the type of the source
parameter. The expected behavior is that it groups the elements of source
by key values that are obtained by invoking keySelector
on each element. The comparer
parameter is used to compare keys and the resultSelector
parameter is used to obtain a result value from each group and its key.
Applies to
GroupBy<TSource,TKey>(IQueryable<TSource>, Expression<Func<TSource,TKey>>)
- Source:
- Queryable.cs
- Source:
- Queryable.cs
- Source:
- Queryable.cs
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::Linq::IQueryable<System::Linq::IGrouping<TKey, TSource> ^> ^ GroupBy(System::Linq::IQueryable<TSource> ^ source, System::Linq::Expressions::Expression<Func<TSource, TKey> ^> ^ keySelector);
public static System.Linq.IQueryable<System.Linq.IGrouping<TKey,TSource>> GroupBy<TSource,TKey> (this System.Linq.IQueryable<TSource> source, System.Linq.Expressions.Expression<Func<TSource,TKey>> keySelector);
static member GroupBy : System.Linq.IQueryable<'Source> * System.Linq.Expressions.Expression<Func<'Source, 'Key>> -> System.Linq.IQueryable<System.Linq.IGrouping<'Key, 'Source>>
<Extension()>
Public Function GroupBy(Of TSource, TKey) (source As IQueryable(Of TSource), keySelector As Expression(Of Func(Of TSource, TKey))) As IQueryable(Of IGrouping(Of TKey, TSource))
Type Parameters
- TSource
The type of the elements of source
.
- TKey
The type of the key returned by the function represented in keySelector
.
Parameters
- source
- IQueryable<TSource>
An IQueryable<T> whose elements to group.
- keySelector
- Expression<Func<TSource,TKey>>
A function to extract the key for each element.
Returns
An IQueryable<IGrouping<TKey, TSource>>
in C# or IQueryable(Of IGrouping(Of TKey, TSource))
in Visual Basic where each IGrouping<TKey,TElement> object contains a sequence of objects and a key.
Exceptions
source
or keySelector
is null
.
Examples
The following code example demonstrates how to use GroupBy<TSource,TKey>(IQueryable<TSource>, Expression<Func<TSource,TKey>>) to group the elements of a sequence.
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
*/
Structure Pet
Public Name As String
Public Age As Integer
End Structure
Shared 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 Pet.Age as the key.
' Use Pet.Name as the value for each entry.
Dim query = pets.AsQueryable().GroupBy(Function(pet) pet.Age)
Dim output As New System.Text.StringBuilder
' Iterate over each IGrouping in the collection.
For Each ageGroup In query
output.AppendFormat("Age group: {0} Number of pets: {1}{2}", ageGroup.Key, ageGroup.Count(), vbCrLf)
Next
' Display the output.
MsgBox(output.ToString())
End Sub
' 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
Remarks
This method has at least one parameter of type Expression<TDelegate> whose type argument is one of the Func<T,TResult> types. For these parameters, you can pass in a lambda expression and it will be compiled to an Expression<TDelegate>.
The GroupBy<TSource,TKey>(IQueryable<TSource>, Expression<Func<TSource,TKey>>) method generates a MethodCallExpression that represents calling GroupBy<TSource,TKey>(IQueryable<TSource>, Expression<Func<TSource,TKey>>) itself as a constructed generic method. It then passes the MethodCallExpression to the CreateQuery<TElement>(Expression) method of the IQueryProvider represented by the Provider property of the source
parameter.
The query behavior that occurs as a result of executing an expression tree that represents calling GroupBy<TSource,TKey>(IQueryable<TSource>, Expression<Func<TSource,TKey>>) depends on the implementation of the type of the source
parameter. The expected behavior is that it groups the elements of source
by a key value that is obtained by invoking keySelector
on each element.
Applies to
GroupBy<TSource,TKey>(IQueryable<TSource>, Expression<Func<TSource,TKey>>, IEqualityComparer<TKey>)
- Source:
- Queryable.cs
- Source:
- Queryable.cs
- Source:
- Queryable.cs
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::Linq::IQueryable<System::Linq::IGrouping<TKey, TSource> ^> ^ GroupBy(System::Linq::IQueryable<TSource> ^ source, System::Linq::Expressions::Expression<Func<TSource, TKey> ^> ^ keySelector, System::Collections::Generic::IEqualityComparer<TKey> ^ comparer);
public static System.Linq.IQueryable<System.Linq.IGrouping<TKey,TSource>> GroupBy<TSource,TKey> (this System.Linq.IQueryable<TSource> source, System.Linq.Expressions.Expression<Func<TSource,TKey>> keySelector, System.Collections.Generic.IEqualityComparer<TKey> comparer);
public static System.Linq.IQueryable<System.Linq.IGrouping<TKey,TSource>> GroupBy<TSource,TKey> (this System.Linq.IQueryable<TSource> source, System.Linq.Expressions.Expression<Func<TSource,TKey>> keySelector, System.Collections.Generic.IEqualityComparer<TKey>? comparer);
static member GroupBy : System.Linq.IQueryable<'Source> * System.Linq.Expressions.Expression<Func<'Source, 'Key>> * System.Collections.Generic.IEqualityComparer<'Key> -> System.Linq.IQueryable<System.Linq.IGrouping<'Key, 'Source>>
<Extension()>
Public Function GroupBy(Of TSource, TKey) (source As IQueryable(Of TSource), keySelector As Expression(Of Func(Of TSource, TKey)), comparer As IEqualityComparer(Of TKey)) As IQueryable(Of IGrouping(Of TKey, TSource))
Type Parameters
- TSource
The type of the elements of source
.
- TKey
The type of the key returned by the function represented in keySelector
.
Parameters
- source
- IQueryable<TSource>
An IQueryable<T> whose elements to group.
- keySelector
- Expression<Func<TSource,TKey>>
A function to extract the key for each element.
- comparer
- IEqualityComparer<TKey>
An IEqualityComparer<T> to compare keys.
Returns
An IQueryable<IGrouping<TKey, TSource>>
in C# or IQueryable(Of IGrouping(Of TKey, TSource))
in Visual Basic where each IGrouping<TKey,TElement> contains a sequence of objects and a key.
Exceptions
source
or keySelector
or comparer
is null
.
Remarks
This method has at least one parameter of type Expression<TDelegate> whose type argument is one of the Func<T,TResult> types. For these parameters, you can pass in a lambda expression and it will be compiled to an Expression<TDelegate>.
The GroupBy<TSource,TKey>(IQueryable<TSource>, Expression<Func<TSource,TKey>>, IEqualityComparer<TKey>) method generates a MethodCallExpression that represents calling GroupBy<TSource,TKey>(IQueryable<TSource>, Expression<Func<TSource,TKey>>, IEqualityComparer<TKey>) itself as a constructed generic method. It then passes the MethodCallExpression to the CreateQuery<TElement>(Expression) method of the IQueryProvider represented by the Provider property of the source
parameter.
The query behavior that occurs as a result of executing an expression tree that represents calling GroupBy<TSource,TKey>(IQueryable<TSource>, Expression<Func<TSource,TKey>>, IEqualityComparer<TKey>) depends on the implementation of the type of the source
parameter. The expected behavior is that it groups the elements of source
by a key value. The key value is obtained by invoking keySelector
on each element, and key values are compared by using comparer
.