什么是编写扩展方法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
答案 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
。如果您想在这种情况下返回其他内容,请使用接受初始种子的重载。