C#聚合函数定义说明

时间:2017-04-03 20:55:40

标签: c#

Enumerable.Aggregate有3个重载版本。我找不到此函数的任何重载版本以匹配official example中使用的版本。

public static TSource Aggregate<TSource>(
    this IEnumerable<TSource> source,
    Func<TSource, TSource, TSource> func
)

以上定义与此官方示例完全不同:

string sentence = "the quick brown fox jumps over the lazy dog";

// Split the string into individual words.
string[] words = sentence.Split(' ');

// Prepend each word to the beginning of the 
// new sentence to reverse the word order.
string reversed = words.Aggregate((workingSentence, next) =>
                                      next + " " + workingSentence);

Console.WriteLine(reversed);

// This code produces the following output:
//
// dog lazy the over jumps fox brown quick the 

以下是聚合函数的3个重载版本:

public static TSource Aggregate<TSource>(this IEnumerable<TSource> source, Func<TSource, TSource, TSource> func);

public static TAccumulate Aggregate<TSource, TAccumulate>(this IEnumerable<TSource> source, TAccumulate seed, Func<TAccumulate, TSource, TAccumulate> func);

public static TResult Aggregate<TSource, TAccumulate, TResult>(this IEnumerable<TSource> source, TAccumulate seed, Func<TAccumulate, TSource, TAccumulate> func, Func<TAccumulate, TResult> resultSelector);

它们都不匹配上例中使用的功能。官方文件是错的吗?或者我错过了某事?请帮助我弥补3个版本的函数定义和这个官方示例之间的差距。

如何理解功能定义?

4 个答案:

答案 0 :(得分:3)

public static TSource Aggregate<TSource>(
    this IEnumerable<TSource> source,
    Func<TSource, TSource, TSource> func
)

这实际上是官方例子中使用的那个:

string reversed = words.Aggregate((workingSentence, next) =>
                                      next + " " + workingSentence);

可能让您感到困惑的一些内容是:

  1. this参数前面的source关键字将其标识为扩展方法,这意味着上面的代码是语法糖:

    string reversed = Enumerable.Aggregate(words, (workingSentence, next) =>
                                      next + " " + workingSentence);
    
  2. TSource是一个通用参数,在本例中用string代替,因为编译器能够推断这个类型来自{{{ 1}}是words

  3. IEnumerable<string>是一个泛型委托,表示一个带有两个参数(前两个Func<TSource, TSource, TSource> s)的函数,并返回TSource。这与TSource形成对比,Action<TSource, TSource>将采用两个参数而不返回值。这些类型中的任何一种都可以使用形式为(param1, param2) => expression的lambda表达式表示。

答案 1 :(得分:2)

您提供的示例使用您发布的第一个重载。这可能是因为它是一种让你失望的扩展方法。

使用扩展方法,this参数将成为对其调用的实例的引用。编译代码时,会将其转换为正确的静态方法调用。基本上,当你写这个:

words.Aggregate((workingSentence, next) =>
                                  next + " " + workingSentence);

它汇编成:

Enumerable.Aggregate<string>(words, (workingSentence, next) =>
                                  next + " " + workingSentence);

答案 2 :(得分:1)

this修饰符表示重载是Extension Method

因此,在这种情况下,方法定义中的this IEnumerable<TSource> source对应于示例中的words

答案 3 :(得分:1)

官方文件完全正确。在官方示例中,使用以下签名:

public static TSource Aggregate<TSource>(this IEnumerable<TSource> source, Func<TSource, TSource, TSource> func);

这是一个扩展方法,然后string [] word作为字符串数组匹配IEnumerable源。以下代码与Func func匹配:

(workingSentence, next) => next + " " + workingSentence

换句话说,你可以写:

Func<string, string, string> func = (workingSentence, next) => next + " " + workingSentence;
words.Aggregate(func);

输入func中的两个第一个字符串,最后一个是返回值类型,在此示例中是两个字符串的聚合。