Linq扩展方法之Aggregate 对序列应用累加器函数;
函数模板:// 函数名:对序列应用累加器函数。 // Parameters:参数要求 // source:要聚合的 System.Collections.Generic.IEnumerable`1。 // func:要对每个元素调用的累加器函数。 // Type parameters:参数类型 // TSource:source 中的元素的类型。 // // Returns:累加器的最终值。 // Exceptions: // T:System.ArgumentNullException: // source 或 func 为 null。 // T:System.InvalidOperationException: // source 中不包含任何元素。 public static TSource Aggregate<TSource>(this IEnumerable<TSource> source, Func<TSource, TSource, TSource> func);
int[] numbers1 = { 1, 2, 3, 4, 5, 6, 7, 8, 9 }; var query1 = numbers1.Aggregate((a, b) => a * b); a的依次变更为:
a=1,a*b=1*2;
a=2,a*b=2*3;
a=6,a*b=6*4;
a=24,a*b=24*5;
a=120,a*b=120*6=720;................
// 对序列应用累加器函数。 将指定的种子值用作累加器初始值。
public static TAccumulate Aggregate<TSource, TAccumulate>(this IEnumerable<TSource> source, TAccumulate seed, Func<TAccumulate, TSource, TAccumulate> func);
int[] numbers = { 9, 3, 5, 4, 2, 6, 7, 1, 8 }; var query = numbers.Aggregate(5, (a, b) => ((a < b) ? (a * b) : a));
a的依次变更为:
a=5,((a < b) ? (a * b) : a)):5*9=45;
第二次时:a值为45,b 为3;
第三次此时:a值为45,b 为3;
。。。。。。。。
自定义方法实现
// Summary: // 对序列应用累加器函数。 将指定的种子值用作累加器的初始值,并使用指定的函数选择结果值。 // // Parameters: // source: // 要聚合的 System.Collections.Generic.IEnumerable`1。 // // seed: // 累加器的初始值。 // // func: // 要对每个元素调用的累加器函数。 // // resultSelector: // 将累加器的最终值转换为结果值的函数。 // // Type parameters: // TSource: // source 中的元素的类型。 // // TAccumulate: // 累加器值的类型。 // // TResult: // 结果值的类型。 // // Returns: // 已转换的累加器最终值。 // // Exceptions: // T:System.ArgumentNullException: // source 或 func 或 resultSelector 为 null。 public static TResult Aggregate<TSource, TAccumulate, TResult>(this IEnumerable<TSource> source, TAccumulate seed, Func<TAccumulate, TSource, TAccumulate> func, Func<TAccumulate, TResult> resultSelector);