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个版本的函数定义和这个官方示例之间的差距。
如何理解功能定义?
答案 0 :(得分:3)
public static TSource Aggregate<TSource>(
this IEnumerable<TSource> source,
Func<TSource, TSource, TSource> func
)
这实际上是官方例子中使用的那个:
string reversed = words.Aggregate((workingSentence, next) =>
next + " " + workingSentence);
可能让您感到困惑的一些内容是:
this
参数前面的source
关键字将其标识为扩展方法,这意味着上面的代码是语法糖:
string reversed = Enumerable.Aggregate(words, (workingSentence, next) =>
next + " " + workingSentence);
TSource
是一个通用参数,在本例中用string
代替,因为编译器能够推断这个类型来自{{{ 1}}是words
。
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中的两个第一个字符串,最后一个是返回值类型,在此示例中是两个字符串的聚合。