Динамическая передача групповой функции в запрос Linq

#c# #linq

#c# #linq

Вопрос:

У меня есть запрос linq, который группирует элементы в списке на основе идентификатора и запускает функцию, такую как Min, Max или Average, для значений. Пожалуйста, посмотрите код ниже.

Я хочу иметь возможность динамически передавать функции Min, Max или Average и т.д. В этот запрос. Как мы можем сделать это с помощью linq?

 class ZoneValue
{
    public string Id { get; set; }
    public string Value { get; set; }
}

static void Main(string[] args)
{
    var values = new List<ZoneValue>();

    values.Add(new ZoneValue() { Id = "1000", Value = "33" });
    values.Add(new ZoneValue() { Id = "1000", Value = "87" });
    values.Add(new ZoneValue() { Id = "1000", Value = "29" });
    values.Add(new ZoneValue() { Id = "1000", Value = "14" });
    values.Add(new ZoneValue() { Id = "2000", Value = "67" });
    values.Add(new ZoneValue() { Id = "3000", Value = "33" });
    values.Add(new ZoneValue() { Id = "3000", Value = "15" });
    values.Add(new ZoneValue() { Id = "3000", Value = "17" });
    values.Add(new ZoneValue() { Id = "3000", Value = "67" });
    values.Add(new ZoneValue() { Id = "4000", Value = "54" });
    values.Add(new ZoneValue() { Id = "5000", Value = "18" });

    var result = (from zoneValue in values
                  group zoneValue by zoneValue.Id into groupResult
                  select new ZoneValue
                  {
                      Id = groupResult.Key,
                      Value = groupResult.Min(x => Double.Parse(x.Value)).ToString()
                  }).ToList();
}
  

Ответ №1:

просто создайте переменную типа Func<T, TResult> и передайте ее в свой запрос:

 Func<IGrouping<string, ZoneValue>, Double> func;
if(condition) 
    func = group => group.Min(x => Double.Parse(x.Value));
else if(condition2)
    func = group => group.Max(x => Double.Parse(x.Value));
else
    func = group => group.Average(x => Double.Parse(x.Value));
  

Теперь вы используете это следующим образом:

 var result = (from zoneValue in values
              group zoneValue by zoneValue.Id into groupResult
              select new ZoneValue
              {
                  Id = groupResult.Key,
                  Value = func(groupResult).ToString()
              }).ToList();
  

Комментарии:

1. Извините, но что здесь такое Zombi? и правильно ли это синтаксически? Я думаю, что закрывающая угловая скобка должна быть после, Double

2. @Aamir Извините, я исправляюсь ZoneValue . Обновил мой ответ.