在MSDN上,我发现Enumerable.GroupBy方法的以下重载:

public static 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)


以及以下示例:

    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 } };

    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()
    });


尽管我了解此代码的工作原理,但我无法想到它的实际用法。正如我现在所看到的,这将返回一个Enumerable,其代码末尾定义了匿名类型的元素。但是,为什么GroupBy方法会返回未分组的枚举?不能通过使用Select,OrderBy等来完成?还是此重载的主要目的是自己定义Dictionary作为TResult的一部分?

最佳答案

以下两个查询将产生相同的结果。

var queryA = source
    .GroupBy(x => x.Id)
    .Select(g => new { Id = g.Key, Count = g.Count() });

var queryB = source
    .GroupBy(x => x.Id, (key, g) => new { Id = key, Count = g.Count() });


区别在于,第一个查询必须为每个组实例化一个IGrouping<TKey, TElement>,而第二个查询则不必。在这种情况下,您应该首选queryB

关于c# - 具有结果选择器重载的Linq的GroupBy方法有什么用?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33905631/

10-15 21:25