【问题标题】:Generic extension methods in LINQLINQ 中的通用扩展方法
【发布时间】:2014-02-17 23:44:11
【问题描述】:
public static class LinqExtensions
    {
        public static double Variance(this IList<double> data)
        {
            double sumSquares=0;
            double avg = data.Average();
            foreach (var num in data)
            {
                sumSquares += (num - avg * num - avg);
            }
            return sumSquares / (data.Count - 1);
        }
        public static decimal? Variance<TSource>(this IEnumerable<TSource> source, Func<TSource, decimal?> selector)
        {
            //where to start for implementing?
        }
    }

我想为泛型类型做一些 LINQ 扩展。我知道如何在不使用委托的情况下扩展 LINQ,我有几个尚未定义的类型,它们将具有我需要枚举的属性以及诸如方差之类的东西。如何定义我的 Variance 扩展方法以便它接受委托?

【问题讨论】:

    标签: c# linq generics


    【解决方案1】:

    你可以这样做:

    public static double? Variance<TSource>(this IEnumerable<TSource> source,
          Func<TSource, double> selector)
    {
        double sumSquares=0;
        double avg = source.Average(selector);
        foreach (var item in source)
        {
            var num = selector(item);
            sumSquares += (num - avg * num - avg);
        }
        return sumSquares / (source.Count() - 1);
    }
    

    这里正在处理那个样本 - http://dotnetfiddle.net/emPZC8

    更新

    使用示例:

    public class Item
    {
        public double Val {get;set;}
    }
    
    public class Program
    {
        public void Main()
        {
            var items = new List<Item>();
            items.Add(new Item(){Val=1.1});
            items.Add(new Item(){Val=2.1});
            items.Add(new Item(){Val=3.1});
    
            var variance = items.Variance<Item>((i) => i.Val);
            Console.WriteLine(variance);
        }
    }
    

    【讨论】:

    • @Sergey 完美。谢谢 + 1
    • DotNetFiddle 上的 Fiddle 有使用示例,但我也将其复制到了答案中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-23
    • 1970-01-01
    • 1970-01-01
    • 2011-03-11
    • 1970-01-01
    相关资源
    最近更新 更多