我有一个基于某些ID或字符串值的列表,我希望通过
更改计算类型var result = from r in mlist
group r by new
{
r.ParameterId,
r.WId,
} into g
select new
{
g.Key.ParameterId,
g.Key.WId,
Value = g.Sum(x => x.Value)
};
我想用自定义方法替换此 linq Sum,该方法将根据某些计算类型(如avg,sum等)返回计算结果。
可能是这样的:
var result = from r in mlist
group r by new
{
r.ParameterId,
r.WId,
} into g
select new
{
g.Key.ParameterId,
g.Key.WId,
Value = g.CustomMethod(x => x.Value, x.calctype)
};
答案 0 :(得分:3)
您可以通过向IEnumerable接口添加扩展方法来扩展可用于LINQ查询的方法集。例如,除了标准的平均或最大操作之外,您还可以创建自定义聚合方法以从一系列值计算单个值。您还可以创建一个方法,作为自定义过滤器或值序列的特定数据转换,并返回一个新序列。
public static class LINQExtension
{
public static double Median(this IEnumerable<double> source)
{
if (source.Count() == 0)
{
throw new InvalidOperationException("Cannot compute median for an empty set.");
}
var sortedList = from number in source
orderby number
select number;
int itemIndex = (int)sortedList.Count() / 2;
if (sortedList.Count() % 2 == 0)
{
// Even number of items.
return (sortedList.ElementAt(itemIndex) + sortedList.ElementAt(itemIndex - 1)) / 2;
}
else
{
// Odd number of items.
return sortedList.ElementAt(itemIndex);
}
}
}
答案 1 :(得分:0)
我认为你应该编写自己的扩展方法,例如:
public static class MyEnumerable
{
public static int CustomMethod<TSource>(this IEnumerable<TSource> source, Func<TSource, int> selector, Func<TSource, int> type)
{
var sum = 0;
source.ToList().ForEach(x => sum += selector(x) * type(x));
return sum;
}
}
你将以这种方式执行它,你的第二个代码清单将不会被编译:
Value = g.CustomMethod(x => x.Value, x => x.calctype)
如果您想要所有项目的一个calctype,您可以写下:
Value = g.CustomMethod(x => x.Value, x => 123);