IEnumerable的扩展方法

时间:2010-12-15 00:45:50

标签: c# .net .net-4.0

什么是编写扩展方法dor IEumerable的解决方案,例如重新调整elemet的squarea之和

例如:

IList<double> L = new List<double>();
L.Add(1);
L.Add(2);
L.Add(3);

var result = L.MyMethod();

结果的期望值是1 * 1 + 2 * 2 + 3 * 3 = 14

2 个答案:

答案 0 :(得分:3)

您不需要扩展方法。你可以说

var sumOfSquares = list.Sum(x => x * x);

显然你可以用

作为扩展方法
public static class EnumerableDoubleExtensions {
    public static double SumSquares(this IEnumerable<double> source) {
        Contract.Requires(source != null);
        return source.Sum(x => x * x);
     }
}

做产品你只需说

list.Aggregate(1d, (p, x) => p * x);

您可以通过

轻松制作扩展方法
public static class EnumerableDoubleExtensions {
    public static double Product(this IEnumerable<double> source) {
        Contract.Requires(source != null);
        return source.Aggregate(1d, (p, x) => p * x);
     }
}

请注意,这使用Enumerable.Aggregate Enumerable.Sum是一种特殊情况。

答案 1 :(得分:1)

最简单的方法是使用Enumerable.Sum的重载来汇总序列中投影值的序列:

public static double GetSumOfSquares(this IEnumerable<double> numbers)
{
    if(numbers == null)
       throw new ArgumentNullException("numbers");

    return numbers.Sum(x => x * x);
}

请注意,对于空序列,这将返回0D。这类似于:

numbers.Select(x => x * x)
       .Sum();

至于你有关乘以它们的问题,你可以使用Enumerable.Aggregate,这是一个更通用的运算符,用于对序列执行累加运算:

double product = numbers.Aggregate((productSoFar, next) => productSoFar * next);

如果序列为空,这将抛出InvalidOperationException。如果您想在这种情况下返回其他内容,请使用接受初始种子的重载。