什么是resurns为elemetns扩展方法上的IEnumerable
例如用于squarea的例子总和用于写入扩展方法DOR IEumerable溶液:
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
什么是resurns为elemetns扩展方法上的IEnumerable
例如用于squarea的例子总和用于写入扩展方法DOR IEumerable溶液:
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
您不需要扩展方法。你只能说
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
是一种特殊情况。
最简单的方法是使用的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
。如果您想在这种情况下返回其他内容,请使用接受初始种子的重载。
好吧,但让我说我想要有多重性1 * 2 * 3?我只想知道这样做:) – gruber 2010-12-15 00:49:09
@Gruber:看我的编辑。 – jason 2010-12-15 00:54:50
关于产品;使用带有初始种子的重载并不是一个好主意,因为该方法将为空序列返回“1”。 – Ani 2010-12-15 00:58:29