如何使用lambda表达式更改计算类型?

时间:2015-12-15 06:14:43

标签: c# linq lambda

我有一个基于某些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)
                     };

2 个答案:

答案 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);
        }
    }
}

Source: Add Custom Methods for LINQ Queries

您还想查看Create the function using Expression linq

答案 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);