c# - 带有 resultselector 重载的 Linq GroupBy 方法有什么用?

标签 c# linq

在 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# - 带有 resultselector 重载的 Linq GroupBy 方法有什么用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33905631/

相关文章:

c# - PagedList 和异步

c# - 从其他窗口获取 ListView 项目文本

c# - 为 sql 中的聚合非重复计数编写一个可比较的 LINQ 查询?

使用 LINQ 的 C# Entity Framework

C# HttpListener 'Bad request' 问题

c# - 使用 WCF 服务拒绝连接

c# - 不允许两个不同对象范围之间的对象引用

c# - 从通用列表 <Datarow> 转换为通用列表 <string> 时出错

c# - 如何使用 F# 中的 LINQ 提供程序?

c# - 如何在C#中与列表相交?