LINQ中的通用扩展方法

8
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扩展方法以便它接受一个委托?

1个回答

8
你可以这样做:
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);
}

这是一个涉及 IT 技术的示例代码 - 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 - wootscootinboogie
DotNetFiddle上的Fiddle有使用示例,但我也将其复制到答案中了。 - Sergey Litvinov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接