“折叠” LINQ扩展方法在哪里?


94

我在MSDN的Linq样本中发现了一个我想使用的名为Fold()的整洁方法。他们的例子:

double[] doubles = { 1.7, 2.3, 1.9, 4.1, 2.9 }; 
double product = 
     doubles.Fold((runningProduct, nextFactor) => runningProduct * nextFactor); 

不幸的是,无论是在示例中还是在我自己的代码中,我都无法对此进行编译,并且在MSDN中找不到其他提及此方法的地方(例如Enumerable或Array扩展方法)。我得到的错误是一个普通的旧“不知道该错误”错误:

error CS1061: 'System.Array' does not contain a definition for 'Fold' and no 
extension method 'Fold' accepting a first argument of type 'System.Array' could 
be found (are you missing a using directive or an assembly reference?)

我正在使用其他一些我认为来自Linq的方法(例如Select()和Where()),并且我正在“使用System.Linq”,所以我认为一切都很好。

此方法确实存在于C#3.5中吗?如果存在,我在做什么错?


3
在您参考的示例页面上查看面包屑痕迹*-它将C#3称为未来产品。将来的产品通常会在发货前进行更改。像其他提到的一样,请参见Enumerable.Aggregate并玩得开心。:) * Visual C#开发人员中心>主页>产品信息>将来的版本> 101 LINQ示例>综合运算符
Curt Nichols,2009年

Answers:


125

您将要使用Aggregate扩展方法:

double product = doubles.Aggregate(1.0, (prod, next) => prod * next);

有关更多信息,请参见MSDN。它使您可以指定a seed,然后指定一个表达式以计算连续值。


4
应该指出的是,您也不必拥有种子。如果调用没有种子的重载,则列表中的第一个元素将用作初始聚合值,并且Func仅在到达第二个元素时才调用。请参阅:msdn.microsoft.com/en-us/library/vstudio/…–
Josh Gallagher

如果我理解正确,它不是折叠的:/折叠应该接受不同类型的两个参数。例如,第一个arg可以使用字符串,而第二个arg可以使用ToString(),因此可以返回整个容器的文本表示形式。
Hi-Angel

@ Hi-Angel,不,实际上是一个例子。所述<double>类型参数是刚刚由编译器自动推断出,因此没有必要的。
kdbanman 2015年

1
@ Hi-Angel,p并且elem可以是您喜欢的任何类型。请参阅示例中
kdbanman 2015年

1
@kdbanman errr,⁺¹,这真的很有趣,为什么它在我之前不起作用……:/你是对的,它确实起作用。
Hi-Angel

41

折叠(也称为Reduce)是函数式编程的标准术语。无论出于什么原因,它在LINQ中都被命名为Aggregate

double product = doubles.Aggregate(1.0, (runningProduct, nextFactor) => runningProduct* nextFactor);

9
在OO和SQL领域中,聚合是一个更为熟悉的术语。
亚当·罗宾逊

3
不了解CREATE AGGREGATE关键字(msdn.microsoft.com/en-us/library/ms182741.aspx)每天学习新知识。
理查德·伯格

5
有趣的是,我从未听说过SQL之外的“聚合”。WP的清单en.wikipedia.org/wiki/Fold_(高级功能)包含几十种语言,而C#是唯一将其称为“聚合”的语言。“减少”是明显的赢家,其次是ML家族的“折叠”,以及Smalltalk和朋友的“注入”。

12
名称取决于功能。它的实现方式无关紧要。和FWIW一样,在可能的情况下...可能会通过尾部递归以迭代方式反复实现左折。而且C#没有正确的选择,部分原因是选择了一个愚蠢的名称-尽管不如“ map”的“ select”那么糟糕-却忽略了现有的功能技术。至于Aggregate是OO领域中一个更熟悉的术语……不,一点也不。
吉姆·巴尔特

9
公平地说,我不认为这是微软对现有功能技术或术语的无视,而是它对数据库访问和SQL术语的定位,许多企业程序员可能比功能编程术语更熟悉这些术语。
RavuAlHemio
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.