1 // Licensed to the .NET Foundation under one or more agreements. 2 // The .NET Foundation licenses this file to you under the MIT license. 3 // See the LICENSE file in the project root for more information. 4 5 using System.Collections.Generic; 6 7 namespace System.Linq 8 { 9 public static partial class Enumerable 10 { Aggregate(this IEnumerable<TSource> source, Func<TSource, TSource, TSource> func)11 public static TSource Aggregate<TSource>(this IEnumerable<TSource> source, Func<TSource, TSource, TSource> func) 12 { 13 if (source == null) 14 { 15 throw Error.ArgumentNull(nameof(source)); 16 } 17 18 if (func == null) 19 { 20 throw Error.ArgumentNull(nameof(func)); 21 } 22 23 using (IEnumerator<TSource> e = source.GetEnumerator()) 24 { 25 if (!e.MoveNext()) 26 { 27 throw Error.NoElements(); 28 } 29 30 TSource result = e.Current; 31 while (e.MoveNext()) 32 { 33 result = func(result, e.Current); 34 } 35 36 return result; 37 } 38 } 39 Aggregate(this IEnumerable<TSource> source, TAccumulate seed, Func<TAccumulate, TSource, TAccumulate> func)40 public static TAccumulate Aggregate<TSource, TAccumulate>(this IEnumerable<TSource> source, TAccumulate seed, Func<TAccumulate, TSource, TAccumulate> func) 41 { 42 if (source == null) 43 { 44 throw Error.ArgumentNull(nameof(source)); 45 } 46 47 if (func == null) 48 { 49 throw Error.ArgumentNull(nameof(func)); 50 } 51 52 TAccumulate result = seed; 53 foreach (TSource element in source) 54 { 55 result = func(result, element); 56 } 57 58 return result; 59 } 60 Aggregate(this IEnumerable<TSource> source, TAccumulate seed, Func<TAccumulate, TSource, TAccumulate> func, Func<TAccumulate, TResult> resultSelector)61 public static TResult Aggregate<TSource, TAccumulate, TResult>(this IEnumerable<TSource> source, TAccumulate seed, Func<TAccumulate, TSource, TAccumulate> func, Func<TAccumulate, TResult> resultSelector) 62 { 63 if (source == null) 64 { 65 throw Error.ArgumentNull(nameof(source)); 66 } 67 68 if (func == null) 69 { 70 throw Error.ArgumentNull(nameof(func)); 71 } 72 73 if (resultSelector == null) 74 { 75 throw Error.ArgumentNull(nameof(resultSelector)); 76 } 77 78 TAccumulate result = seed; 79 foreach (TSource element in source) 80 { 81 result = func(result, element); 82 } 83 84 return resultSelector(result); 85 } 86 } 87 } 88