#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
. Обновил мой ответ.