Enumerable.GroupBy
およびQueryable.GroupBy
拡張機能には8つのオーバーロードがあります。 (Enumerable.GroupBy
用)それらのうちの2つは、以下のとおりです。elementSelectorおよびresultSelectorを持つGroupBy
// (a)
IEnumerable<TResult> GroupBy<TSource, TKey, TResult>(
this IEnumerable<TSource> source,
Func<TSource, TKey> keySelector,
Func<TKey, IEnumerable<TSource>, TResult> resultSelector);
// (b)
IEnumerable<TResult> GroupBy<TSource, TKey, TElement, TResult>(
this IEnumerable<TSource> source,
Func<TSource, TKey> keySelector,
Func<TSource, TElement> elementSelector,
Func<TKey, IEnumerable<TElement>, TResult> resultSelector);
(Queryable.GroupBy
のために同じ、だけではなく、Func<...
のExpression<Func<...
付き)
(b)
がパラメータとして追加elementSelector
を持っています。
MSDNでan example for overload (a)およびan example for overload (b)です。同じ例のソースコレクションを持つ彼らは、仕事の両方:
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 }
};
例は、(a)は、このクエリを使用しています。
var query = petsList.GroupBy(
pet => Math.Floor(pet.Age), // keySelector
(age, pets) => new // resultSelector
{
Key = age,
Count = pets.Count(),
Min = pets.Min(pet => pet.Age),
Max = pets.Max(pet => pet.Age)
});
そして例(b)は、このクエリを使用しています。
var query = petsList.GroupBy(
pet => Math.Floor(pet.Age), // keySelector
pet => pet.Age, // elementSelector
(baseAge, ages) => new // resultSelector
{
Key = baseAge,
Count = ages.Count(),
Min = ages.Min(),
Max = ages.Max()
});
結果両方のクエリの正確に同じです。
質問1:resultSelector
を単独で使用し、実際にはelementSelector
が必要なクエリはありませんか?または、2つのオーバーロードの機能が常に同等で、どちらか一方を使用するのは単なる味の問題ですか?
質問2:LINQクエリ構文を使用すると、2つの異なるオーバーロードの対応がありますか? IEnumerableをするために:(Entity FrameworkのとQueryable.GroupBy
を使用する場合、両方のオーバーロードを正確に同じSQLに変換される側の問題として?)