2010-12-15 95 views
0

什么是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

回答

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是一种特殊情况。

+0

好吧,但让我说我想要有多重性1 * 2 * 3?我只想知道这样做:) – gruber 2010-12-15 00:49:09

+0

@Gruber:看我的编辑。 – jason 2010-12-15 00:54:50

+0

关于产品;使用带有初始种子的重载并不是一个好主意,因为该方法将为空序列返回“1”。 – Ani 2010-12-15 00:58:29

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。如果您想在这种情况下返回其他内容,请使用接受初始种子的重载。

+0

好吧,那么写mehtod会返回多样性怎么样? 1 * 2 * 3? – gruber 2010-12-15 00:50:07

+0

好吧,现在我想有机会打电话给MyList.MyCustomAggregation,它会给你写的结果吗?你能告诉我如何写这样的方法作为IEnumerable的扩展?在此先感谢 – gruber 2010-12-15 01:05:03

+0

@gruber:你的意思是一般?或专门为乘法? – Ani 2010-12-15 01:06:11