Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

switch between aggregate functions with linq

I have two methods that look almost the same, except for the aggregate function used in the Linq query. For example:

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)));
    // ...
}

where the Item is a class like this:

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

Since both methods do the same thing, I would like have just one method where I pass the IEnumerable and the aggregate function (sum / max) as parameters. How can I achieve that?

like image 597
Fernando Avatar asked Mar 12 '26 13:03

Fernando


1 Answers

Try the following

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));
like image 50
JaredPar Avatar answered Mar 14 '26 03:03

JaredPar



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!