c# - 使用 linq 在聚合函数之间切换

标签 c# linq aggregate-functions

我有两个看起来几乎一样的方法,除了在 Linq 查询中使用的聚合函数。例如:

public IEnumerable<Item> DoStuff(IEnumerable<Item> someItems) {
    var items = someItems.GroupBy(i => i.Date).Select(p => new Item(p.Key, p.Sum(r => r.Value)));
    // ...
}

public IEnumerable<Item> DoOtherStuff(IEnumerable<Item> someItems) {
    var items = someItems.GroupBy(i => i.Date).Select(p => new Item(p.Key, p.Max(r => r.Value)));
    // ...
}

Item 是这样的类:

public class Item {
    public DateTime Date { get; private set; }
    public decimal Value { get; private set; }

    public Item(DateTime date, decimal value) {
     Date = date;
     Value = value;
    }
}

由于这两种方法做同样的事情,我希望只有一种方法可以将 IEnumerable 和聚合函数 (sum/max) 作为参数传递。我怎样才能做到这一点?

最佳答案

尝试以下操作

public IEnumerable<Item> DoStuff(
  IEnumerable<Item> someItems,
  Func<IGrouping<DateTime,decimal>,Item> reduce) {
  var items = someItems.GroupBy(i => i.Date).Select(reduce);
  ...
}

DoStuff(someItems, p => p.Sum(r => r.Value));
DoStuff(someItems, p => p.Max(r => r.Value));

关于c# - 使用 linq 在聚合函数之间切换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3506768/

相关文章:

c# - 帮助 LINQ 查询

json - 在一列中获取所有 jsonb 值以供在 to_tsvector 中使用

c# - 使用 WPF 和 XAML 创建图像的滚动网格

c# - 如何创建带有倾斜边框的文本框和标签?

c# - 设置位掩码以针对等于 0xFFFF0000 的 int 使用的最方便的方法是什么

linq - RavenDB 使用带有分组依据的过滤器

c# - 在 asp.net core 中使用自定义 IServiceProvider 实现

c# - Linq Group By Into 附加参数

sql - 聚合多个条件 : convert to a single query

sql - 将时间戳截断为任意间隔