用linq在聚合函数之间切换

Fer*_*ndo 2 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)));
    // ...
}
Run Code Online (Sandbox Code Playgroud)

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

Jar*_*Par 8

请尝试以下方法

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));
Run Code Online (Sandbox Code Playgroud)