@@ -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+
72357291class function TEnumerable.CombinePredicates <T>(const predicate1,
72367292 predicate2: Predicate<T>): Predicate<T>;
72377293begin
@@ -7459,6 +7515,136 @@ class function TEnumerable.SelectMany<T, TResult>(const source: IEnumerable<T>;
74597515 Result := TSelectManyIterator<T, TResult>.Create(source, selector);
74607516end ;
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+
74627648class function TEnumerable.ToDictionary <TSource, TKey>(
74637649 const source: IEnumerable<TSource>;
74647650 const keySelector: Func<TSource, TKey>): IDictionary<TKey, TSource>;
0 commit comments