Skip to content

Commit 94de12a

Browse files
committed
implemented TEnumerable.Aggregate and Sum overloads
1 parent 330847d commit 94de12a

File tree

1 file changed

+186
-0
lines changed

1 file changed

+186
-0
lines changed

Source/Base/Collections/Spring.Collections.pas

Lines changed: 186 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3374,6 +3374,12 @@ TEnumerable = class
33743374
class procedure InternalFrom_Interface_DynArray(source: Pointer; var result; elementType: PTypeInfo); static;
33753375
class procedure InternalFrom_Interface_OpenArray(source: Pointer; count: Integer; var result; elementType: PTypeInfo); static;
33763376
public
3377+
class function Aggregate<TSource, TAccumulate>(const source: IEnumerable<TSource>;
3378+
const seed: TAccumulate; const func: Func<TAccumulate, TSource, TAccumulate>): TAccumulate; overload; static;
3379+
class function Aggregate<TSource, TAccumulate, TResult>(const source: IEnumerable<TSource>;
3380+
const seed: TAccumulate; const func: Func<TAccumulate, TSource, TAccumulate>;
3381+
const resultSelector: Func<TAccumulate, TResult>): TResult; overload; static;
3382+
33773383
class function CombinePredicates<T>(const predicate1, predicate2: Predicate<T>): Predicate<T>; static;
33783384

33793385
/// <summary>
@@ -3435,6 +3441,22 @@ TEnumerable = class
34353441
class function SelectMany<T, TResult>(const source: IEnumerable<T>;
34363442
const selector: Func<T, IEnumerable<TResult>>): IEnumerable<TResult>; overload; static;
34373443

3444+
class function Sum(const source: IEnumerable<Integer>): Integer; overload; static;
3445+
class function Sum(const source: IEnumerable<Int64>): Int64; overload; static;
3446+
class function Sum(const source: IEnumerable<Single>): Single; overload; static;
3447+
class function Sum(const source: IEnumerable<Double>): Double; overload; static;
3448+
class function Sum(const source: IEnumerable<Currency>): Currency; overload; static;
3449+
class function Sum<TSource>(const source: IEnumerable<TSource>;
3450+
const selector: Func<TSource, Integer>): Integer; overload; static;
3451+
class function Sum<TSource>(const source: IEnumerable<TSource>;
3452+
const selector: Func<TSource, Int64>): Int64; overload; static;
3453+
class function Sum<TSource>(const source: IEnumerable<TSource>;
3454+
const selector: Func<TSource, Single>): Single; overload; static;
3455+
class function Sum<TSource>(const source: IEnumerable<TSource>;
3456+
const selector: Func<TSource, Double>): Double; overload; static;
3457+
class function Sum<TSource>(const source: IEnumerable<TSource>;
3458+
const selector: Func<TSource, Currency>): Currency; overload; static;
3459+
34383460
class function ToDictionary<TSource, TKey>(const source: IEnumerable<TSource>;
34393461
const keySelector: Func<TSource, TKey>): IDictionary<TKey, TSource>; overload; static;
34403462
class function ToDictionary<TSource, TKey>(const source: IEnumerable<TSource>;
@@ -7232,6 +7254,40 @@ class function TCollections.CreateSortedMultiSet<T>(
72327254

72337255
{$REGION 'TEnumerable'}
72347256

7257+
class function TEnumerable.Aggregate<TSource, TAccumulate>(
7258+
const source: IEnumerable<TSource>; const seed: TAccumulate;
7259+
const func: Func<TAccumulate, TSource, TAccumulate>): TAccumulate;
7260+
var
7261+
enumerator: IEnumerator<TSource>;
7262+
begin
7263+
if not Assigned(source) then RaiseHelper.ArgumentNil(ExceptionArgument.source);
7264+
if not Assigned(func) then RaiseHelper.ArgumentNil(ExceptionArgument.func);
7265+
7266+
Result := seed;
7267+
enumerator := source.GetEnumerator;
7268+
while enumerator.MoveNext do
7269+
Result := func(Result, enumerator.Current);
7270+
end;
7271+
7272+
class function TEnumerable.Aggregate<TSource, TAccumulate, TResult>(
7273+
const source: IEnumerable<TSource>; const seed: TAccumulate;
7274+
const func: Func<TAccumulate, TSource, TAccumulate>;
7275+
const resultSelector: Func<TAccumulate, TResult>): TResult;
7276+
var
7277+
enumerator: IEnumerator<TSource>;
7278+
res: TAccumulate;
7279+
begin
7280+
if not Assigned(source) then RaiseHelper.ArgumentNil(ExceptionArgument.source);
7281+
if not Assigned(func) then RaiseHelper.ArgumentNil(ExceptionArgument.func);
7282+
if not Assigned(resultSelector) then RaiseHelper.ArgumentNil(ExceptionArgument.resultSelector);
7283+
7284+
res := seed;
7285+
enumerator := source.GetEnumerator;
7286+
while enumerator.MoveNext do
7287+
res := func(res, enumerator.Current);
7288+
Result := resultSelector(res);
7289+
end;
7290+
72357291
class function TEnumerable.CombinePredicates<T>(const predicate1,
72367292
predicate2: Predicate<T>): Predicate<T>;
72377293
begin
@@ -7459,6 +7515,136 @@ class function TEnumerable.SelectMany<T, TResult>(const source: IEnumerable<T>;
74597515
Result := TSelectManyIterator<T, TResult>.Create(source, selector);
74607516
end;
74617517

7518+
class function TEnumerable.Sum(const source: IEnumerable<Integer>): Integer;
7519+
var
7520+
enumerator: IEnumerator<Integer>;
7521+
begin
7522+
if not Assigned(source) then RaiseHelper.ArgumentNil(ExceptionArgument.source);
7523+
7524+
Result := 0;
7525+
enumerator := source.GetEnumerator;
7526+
while enumerator.MoveNext do
7527+
Result := Result + enumerator.Current;
7528+
end;
7529+
7530+
class function TEnumerable.Sum(const source: IEnumerable<Int64>): Int64;
7531+
var
7532+
enumerator: IEnumerator<Int64>;
7533+
begin
7534+
if not Assigned(source) then RaiseHelper.ArgumentNil(ExceptionArgument.source);
7535+
7536+
Result := 0;
7537+
enumerator := source.GetEnumerator;
7538+
while enumerator.MoveNext do
7539+
Result := Result + enumerator.Current;
7540+
end;
7541+
7542+
class function TEnumerable.Sum(const source: IEnumerable<Single>): Single;
7543+
var
7544+
enumerator: IEnumerator<Single>;
7545+
begin
7546+
if not Assigned(source) then RaiseHelper.ArgumentNil(ExceptionArgument.source);
7547+
7548+
Result := 0;
7549+
enumerator := source.GetEnumerator;
7550+
while enumerator.MoveNext do
7551+
Result := Result + enumerator.Current;
7552+
end;
7553+
7554+
class function TEnumerable.Sum(const source: IEnumerable<Double>): Double;
7555+
var
7556+
enumerator: IEnumerator<Double>;
7557+
begin
7558+
if not Assigned(source) then RaiseHelper.ArgumentNil(ExceptionArgument.source);
7559+
7560+
Result := 0;
7561+
enumerator := source.GetEnumerator;
7562+
while enumerator.MoveNext do
7563+
Result := Result + enumerator.Current;
7564+
end;
7565+
7566+
class function TEnumerable.Sum(const source: IEnumerable<Currency>): Currency;
7567+
var
7568+
enumerator: IEnumerator<Currency>;
7569+
begin
7570+
if not Assigned(source) then RaiseHelper.ArgumentNil(ExceptionArgument.source);
7571+
7572+
Result := 0;
7573+
enumerator := source.GetEnumerator;
7574+
while enumerator.MoveNext do
7575+
Result := Result + enumerator.Current;
7576+
end;
7577+
7578+
class function TEnumerable.Sum<TSource>(const source: IEnumerable<TSource>;
7579+
const selector: Func<TSource, Integer>): Integer;
7580+
var
7581+
enumerator: IEnumerator<TSource>;
7582+
begin
7583+
if not Assigned(source) then RaiseHelper.ArgumentNil(ExceptionArgument.source);
7584+
if not Assigned(selector) then RaiseHelper.ArgumentNil(ExceptionArgument.selector);
7585+
7586+
Result := 0;
7587+
enumerator := source.GetEnumerator;
7588+
while enumerator.MoveNext do
7589+
Result := Result + selector(enumerator.Current);
7590+
end;
7591+
7592+
class function TEnumerable.Sum<TSource>(const source: IEnumerable<TSource>;
7593+
const selector: Func<TSource, Int64>): Int64;
7594+
var
7595+
enumerator: IEnumerator<TSource>;
7596+
begin
7597+
if not Assigned(source) then RaiseHelper.ArgumentNil(ExceptionArgument.source);
7598+
if not Assigned(selector) then RaiseHelper.ArgumentNil(ExceptionArgument.selector);
7599+
7600+
Result := 0;
7601+
enumerator := source.GetEnumerator;
7602+
while enumerator.MoveNext do
7603+
Result := Result + selector(enumerator.Current);
7604+
end;
7605+
7606+
class function TEnumerable.Sum<TSource>(const source: IEnumerable<TSource>;
7607+
const selector: Func<TSource, Single>): Single;
7608+
var
7609+
enumerator: IEnumerator<TSource>;
7610+
begin
7611+
if not Assigned(source) then RaiseHelper.ArgumentNil(ExceptionArgument.source);
7612+
if not Assigned(selector) then RaiseHelper.ArgumentNil(ExceptionArgument.selector);
7613+
7614+
Result := 0;
7615+
enumerator := source.GetEnumerator;
7616+
while enumerator.MoveNext do
7617+
Result := Result + selector(enumerator.Current);
7618+
end;
7619+
7620+
class function TEnumerable.Sum<TSource>(const source: IEnumerable<TSource>;
7621+
const selector: Func<TSource, Double>): Double;
7622+
var
7623+
enumerator: IEnumerator<TSource>;
7624+
begin
7625+
if not Assigned(source) then RaiseHelper.ArgumentNil(ExceptionArgument.source);
7626+
if not Assigned(selector) then RaiseHelper.ArgumentNil(ExceptionArgument.selector);
7627+
7628+
Result := 0;
7629+
enumerator := source.GetEnumerator;
7630+
while enumerator.MoveNext do
7631+
Result := Result + selector(enumerator.Current);
7632+
end;
7633+
7634+
class function TEnumerable.Sum<TSource>(const source: IEnumerable<TSource>;
7635+
const selector: Func<TSource, Currency>): Currency;
7636+
var
7637+
enumerator: IEnumerator<TSource>;
7638+
begin
7639+
if not Assigned(source) then RaiseHelper.ArgumentNil(ExceptionArgument.source);
7640+
if not Assigned(selector) then RaiseHelper.ArgumentNil(ExceptionArgument.selector);
7641+
7642+
Result := 0;
7643+
enumerator := source.GetEnumerator;
7644+
while enumerator.MoveNext do
7645+
Result := Result + selector(enumerator.Current);
7646+
end;
7647+
74627648
class function TEnumerable.ToDictionary<TSource, TKey>(
74637649
const source: IEnumerable<TSource>;
74647650
const keySelector: Func<TSource, TKey>): IDictionary<TKey, TSource>;

0 commit comments

Comments
 (0)