@@ -19,21 +19,37 @@ public static TSource Aggregate<TSource>(this IEnumerable<TSource> source, Func<
1919                ThrowHelper . ThrowArgumentNullException ( ExceptionArgument . func ) ; 
2020            } 
2121
22-             using  ( IEnumerator < TSource >  e  =  source . GetEnumerator ( ) ) 
22+             TSource  result ; 
23+             if  ( source . TryGetSpan ( out  ReadOnlySpan < TSource >  span ) ) 
2324            { 
25+                 if  ( span . IsEmpty ) 
26+                 { 
27+                     ThrowHelper . ThrowNoElementsException ( ) ; 
28+                 } 
29+ 
30+                 result  =  span [ 0 ] ; 
31+                 for  ( int  i  =  1 ;  i  <  span . Length ;  i ++ ) 
32+                 { 
33+                     result  =  func ( result ,  span [ i ] ) ; 
34+                 } 
35+             } 
36+             else 
37+             { 
38+                 using  IEnumerator < TSource >  e  =  source . GetEnumerator ( ) ; 
39+ 
2440                if  ( ! e . MoveNext ( ) ) 
2541                { 
2642                    ThrowHelper . ThrowNoElementsException ( ) ; 
2743                } 
2844
29-                 TSource   result  =  e . Current ; 
45+                 result  =  e . Current ; 
3046                while  ( e . MoveNext ( ) ) 
3147                { 
3248                    result  =  func ( result ,  e . Current ) ; 
3349                } 
34- 
35-                 return  result ; 
3650            } 
51+ 
52+             return  result ; 
3753        } 
3854
3955        public  static TAccumulate  Aggregate < TSource ,  TAccumulate > ( this  IEnumerable < TSource >  source ,  TAccumulate  seed ,  Func < TAccumulate ,  TSource ,  TAccumulate >  func ) 
@@ -49,9 +65,19 @@ public static TAccumulate Aggregate<TSource, TAccumulate>(this IEnumerable<TSour
4965            } 
5066
5167            TAccumulate  result  =  seed ; 
52-             foreach   ( TSource   element   in   source ) 
68+             if   ( source . TryGetSpan ( out   ReadOnlySpan < TSource >   span ) ) 
5369            { 
54-                 result  =  func ( result ,  element ) ; 
70+                 foreach  ( TSource  element  in  span ) 
71+                 { 
72+                     result  =  func ( result ,  element ) ; 
73+                 } 
74+             } 
75+             else 
76+             { 
77+                 foreach  ( TSource  element  in  source ) 
78+                 { 
79+                     result  =  func ( result ,  element ) ; 
80+                 } 
5581            } 
5682
5783            return  result ; 
@@ -75,9 +101,19 @@ public static TResult Aggregate<TSource, TAccumulate, TResult>(this IEnumerable<
75101            } 
76102
77103            TAccumulate  result  =  seed ; 
78-             foreach   ( TSource   element   in   source ) 
104+             if   ( source . TryGetSpan ( out   ReadOnlySpan < TSource >   span ) ) 
79105            { 
80-                 result  =  func ( result ,  element ) ; 
106+                 foreach  ( TSource  element  in  span ) 
107+                 { 
108+                     result  =  func ( result ,  element ) ; 
109+                 } 
110+             } 
111+             else 
112+             { 
113+                 foreach  ( TSource  element  in  source ) 
114+                 { 
115+                     result  =  func ( result ,  element ) ; 
116+                 } 
81117            } 
82118
83119            return  resultSelector ( result ) ; 
0 commit comments