"折叠"LINQ扩展方法在哪里?

Ken*_*Ken 89 c# linq reduce extension-methods

我在MSDN的Linq示例中找到了一个名为Fold()的简洁方法,我想使用它.他们的例子:

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

不幸的是,无论是在他们的示例中还是在我自己的代码中,我都无法进行编译,而且我在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?)
Run Code Online (Sandbox Code Playgroud)

我正在使用其他我认为来自Linq的方法(比如Select()和Where()),我正在"使用System.Linq",所以我认为一切都好.

这种方法确实存在于C#3.5中,如果是这样,我做错了什么?

Jas*_*son 119

您将需要使用Aggregate扩展方法:

double product = doubles.Aggregate(1.0, (prod, next) => prod * next);
Run Code Online (Sandbox Code Playgroud)

有关更多信息,请参阅MSDN.它允许您指定a seed然后表达式来计算连续值.

  • 应该注意的是,你也没有种子.如果调用没有种子的重载,则列表中的第一个元素将用作初始聚合值,并且只有在到达第二个元素时才会调用"Func".请参阅:https://msdn.microsoft.com/en-us/library/vstudio/bb548651(v = vs.110).aspx (4认同)
  • @Hi-Angel,`p` 和 `elem` 可以是你喜欢的任何类型。请参阅[此重载](https://msdn.microsoft.com/en-us/library/bb549218(v=vs.110).aspx),如[此示例](http://csharppad.com/gist)中使用的/725521c557b659f054df) (2认同)

Ric*_*erg 40

Fold(aka Reduce)是函数式编程的标准术语.无论出于何种原因,它在LINQ中被命名为Aggregate.

double product = doubles.Aggregate(1.0, (runningProduct, nextFactor) => runningProduct* nextFactor);
Run Code Online (Sandbox Code Playgroud)

  • 名称取决于其功能; 如何实施是无关紧要的.而FWIW,左侧折叠在可能的情况下迭代实现...通常通过尾递归在函数式语言中实现.并且C#没有正确的折叠,这部分是选择一个愚蠢名称的结果 - 虽然没有像"地图"的"选择"那么糟糕 - 而忽略了现有的功能技术.至于Aggregate在OO领域是一个更熟悉的术语......不,根本不是. (12认同)
  • 聚合是OO和SQL领域中比较熟悉的术语. (9认同)
  • 公平地说,我认为这不是微软对现有功能技术或术语的忽视,而是它对数据库访问和SQL术语的定位,许多企业程序员可能比函数式编程术语更熟悉这些术语. (8认同)
  • 好笑,我从未听过SQL之外的"聚合".WP有一个由几十种语言组成的列表http://en.wikipedia.org/wiki/Fold_(higher-order_function),而C#是唯一一个称它为"Aggregate"的语言."减少"是明显的赢家,其次是ML家族的"折叠",以及Smalltalk和朋友的"注入". (5认同)
  • 不知道CREATE AGGREGATE关键字(http://msdn.microsoft.com/en-us/library/ms182741.aspx)每天都在学习新东西. (3认同)