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