Enumerable.GroupBy
ve Queryable.GroupBy
eklentilerinde 8 aşırı yükleme var. (Enumerable.GroupBy
için) bunların ikisi şunlardır: GroupBy öğesiyleSelector ve sonuçSelector
// (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
için aynıdır, sadece
Expression<Func<...
yerine
Func<...
ile)
(b)
parametre olarak ek elementSelector
sahiptir.
MSDN, an example for overload (a) ve an example for overload (b)'dur. Aynı örnek kaynak toplama her iki çalışma:
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 }
};
Örnek (a), bu sorgu kullanır:
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)
});
ve Örnek (b), bu sorgu kullanır:
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()
});
sonuç her iki sorgunun da aynısı.
Soru 1: resultSelector
'u kullanarak ve elementSelector
'a gerçekten gereksinim duyacağımı ifade edemediğim herhangi bir sorgu var mı? Ya da iki aşırı yükün yetenekleri her zaman eşdeğerdir ve bir ya da diğerini kullanmak sadece bir zevk meselesi midir?
Soru 2: LINQ sorgu sözdizimini kullanırken iki farklı aşırı yük için bir karşı taraf var mı?
(bir yan soru gibi: Entity Framework ileQueryable.GroupBy
kullanırken, her iki aşırı yükler aynı SQL tercüme edilecek?) IEnumerable için