@@ -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