|
@@ -66,20 +66,82 @@ namespace System.Linq
|
|
|
return SumCore(source, selector, cancellationToken);
|
|
|
}
|
|
|
|
|
|
- private static Task<int> SumCore(IAsyncEnumerable<int> source, CancellationToken cancellationToken)
|
|
|
+ private static async Task<int> SumCore(IAsyncEnumerable<int> source, CancellationToken cancellationToken)
|
|
|
{
|
|
|
- return source.Aggregate(0, (x, y) => x + y, cancellationToken);
|
|
|
+ var sum = 0;
|
|
|
+
|
|
|
+ var e = source.GetAsyncEnumerator(cancellationToken);
|
|
|
+
|
|
|
+ try
|
|
|
+ {
|
|
|
+ while (await e.MoveNextAsync().ConfigureAwait(false))
|
|
|
+ {
|
|
|
+ checked
|
|
|
+ {
|
|
|
+ sum += e.Current;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ finally
|
|
|
+ {
|
|
|
+ await e.DisposeAsync().ConfigureAwait(false);
|
|
|
+ }
|
|
|
+
|
|
|
+ return sum;
|
|
|
}
|
|
|
|
|
|
- private static Task<int> SumCore<TSource>(IAsyncEnumerable<TSource> source, Func<TSource, int> selector, CancellationToken cancellationToken)
|
|
|
+ private static async Task<int> SumCore<TSource>(IAsyncEnumerable<TSource> source, Func<TSource, int> selector, CancellationToken cancellationToken)
|
|
|
{
|
|
|
- return source.Select(selector).Sum(cancellationToken);
|
|
|
+ var sum = 0;
|
|
|
+
|
|
|
+ var e = source.GetAsyncEnumerator(cancellationToken);
|
|
|
+
|
|
|
+ try
|
|
|
+ {
|
|
|
+ while (await e.MoveNextAsync().ConfigureAwait(false))
|
|
|
+ {
|
|
|
+ var value = selector(e.Current);
|
|
|
+
|
|
|
+ checked
|
|
|
+ {
|
|
|
+ sum += value;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ finally
|
|
|
+ {
|
|
|
+ await e.DisposeAsync().ConfigureAwait(false);
|
|
|
+ }
|
|
|
+
|
|
|
+ return sum;
|
|
|
}
|
|
|
|
|
|
- private static Task<int> SumCore<TSource>(IAsyncEnumerable<TSource> source, Func<TSource, Task<int>> selector, CancellationToken cancellationToken)
|
|
|
+ private static async Task<int> SumCore<TSource>(IAsyncEnumerable<TSource> source, Func<TSource, Task<int>> selector, CancellationToken cancellationToken)
|
|
|
{
|
|
|
- return source.Select(selector).Sum(cancellationToken);
|
|
|
+ var sum = 0;
|
|
|
+
|
|
|
+ var e = source.GetAsyncEnumerator(cancellationToken);
|
|
|
+
|
|
|
+ try
|
|
|
+ {
|
|
|
+ while (await e.MoveNextAsync().ConfigureAwait(false))
|
|
|
+ {
|
|
|
+ var value = await selector(e.Current).ConfigureAwait(false);
|
|
|
+
|
|
|
+ checked
|
|
|
+ {
|
|
|
+ sum += value;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ finally
|
|
|
+ {
|
|
|
+ await e.DisposeAsync().ConfigureAwait(false);
|
|
|
+ }
|
|
|
+
|
|
|
+ return sum;
|
|
|
}
|
|
|
+
|
|
|
public static Task<long> Sum(this IAsyncEnumerable<long> source)
|
|
|
{
|
|
|
if (source == null)
|
|
@@ -136,20 +198,82 @@ namespace System.Linq
|
|
|
return SumCore(source, selector, cancellationToken);
|
|
|
}
|
|
|
|
|
|
- private static Task<long> SumCore(IAsyncEnumerable<long> source, CancellationToken cancellationToken)
|
|
|
+ private static async Task<long> SumCore(IAsyncEnumerable<long> source, CancellationToken cancellationToken)
|
|
|
{
|
|
|
- return source.Aggregate(0L, (x, y) => x + y, cancellationToken);
|
|
|
+ var sum = 0L;
|
|
|
+
|
|
|
+ var e = source.GetAsyncEnumerator(cancellationToken);
|
|
|
+
|
|
|
+ try
|
|
|
+ {
|
|
|
+ while (await e.MoveNextAsync().ConfigureAwait(false))
|
|
|
+ {
|
|
|
+ checked
|
|
|
+ {
|
|
|
+ sum += e.Current;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ finally
|
|
|
+ {
|
|
|
+ await e.DisposeAsync().ConfigureAwait(false);
|
|
|
+ }
|
|
|
+
|
|
|
+ return sum;
|
|
|
}
|
|
|
|
|
|
- private static Task<long> SumCore<TSource>(IAsyncEnumerable<TSource> source, Func<TSource, long> selector, CancellationToken cancellationToken)
|
|
|
+ private static async Task<long> SumCore<TSource>(IAsyncEnumerable<TSource> source, Func<TSource, long> selector, CancellationToken cancellationToken)
|
|
|
{
|
|
|
- return source.Select(selector).Sum(cancellationToken);
|
|
|
+ var sum = 0L;
|
|
|
+
|
|
|
+ var e = source.GetAsyncEnumerator(cancellationToken);
|
|
|
+
|
|
|
+ try
|
|
|
+ {
|
|
|
+ while (await e.MoveNextAsync().ConfigureAwait(false))
|
|
|
+ {
|
|
|
+ var value = selector(e.Current);
|
|
|
+
|
|
|
+ checked
|
|
|
+ {
|
|
|
+ sum += value;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ finally
|
|
|
+ {
|
|
|
+ await e.DisposeAsync().ConfigureAwait(false);
|
|
|
+ }
|
|
|
+
|
|
|
+ return sum;
|
|
|
}
|
|
|
|
|
|
- private static Task<long> SumCore<TSource>(IAsyncEnumerable<TSource> source, Func<TSource, Task<long>> selector, CancellationToken cancellationToken)
|
|
|
+ private static async Task<long> SumCore<TSource>(IAsyncEnumerable<TSource> source, Func<TSource, Task<long>> selector, CancellationToken cancellationToken)
|
|
|
{
|
|
|
- return source.Select(selector).Sum(cancellationToken);
|
|
|
+ var sum = 0L;
|
|
|
+
|
|
|
+ var e = source.GetAsyncEnumerator(cancellationToken);
|
|
|
+
|
|
|
+ try
|
|
|
+ {
|
|
|
+ while (await e.MoveNextAsync().ConfigureAwait(false))
|
|
|
+ {
|
|
|
+ var value = await selector(e.Current).ConfigureAwait(false);
|
|
|
+
|
|
|
+ checked
|
|
|
+ {
|
|
|
+ sum += value;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ finally
|
|
|
+ {
|
|
|
+ await e.DisposeAsync().ConfigureAwait(false);
|
|
|
+ }
|
|
|
+
|
|
|
+ return sum;
|
|
|
}
|
|
|
+
|
|
|
public static Task<float> Sum(this IAsyncEnumerable<float> source)
|
|
|
{
|
|
|
if (source == null)
|
|
@@ -206,20 +330,73 @@ namespace System.Linq
|
|
|
return SumCore(source, selector, cancellationToken);
|
|
|
}
|
|
|
|
|
|
- private static Task<float> SumCore(IAsyncEnumerable<float> source, CancellationToken cancellationToken)
|
|
|
+ private static async Task<float> SumCore(IAsyncEnumerable<float> source, CancellationToken cancellationToken)
|
|
|
{
|
|
|
- return source.Aggregate(0.0f, (x, y) => x + y, cancellationToken);
|
|
|
+ var sum = 0.0f;
|
|
|
+
|
|
|
+ var e = source.GetAsyncEnumerator(cancellationToken);
|
|
|
+
|
|
|
+ try
|
|
|
+ {
|
|
|
+ while (await e.MoveNextAsync().ConfigureAwait(false))
|
|
|
+ {
|
|
|
+ sum += e.Current;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ finally
|
|
|
+ {
|
|
|
+ await e.DisposeAsync().ConfigureAwait(false);
|
|
|
+ }
|
|
|
+
|
|
|
+ return sum;
|
|
|
}
|
|
|
|
|
|
- private static Task<float> SumCore<TSource>(IAsyncEnumerable<TSource> source, Func<TSource, float> selector, CancellationToken cancellationToken)
|
|
|
+ private static async Task<float> SumCore<TSource>(IAsyncEnumerable<TSource> source, Func<TSource, float> selector, CancellationToken cancellationToken)
|
|
|
{
|
|
|
- return source.Select(selector).Sum(cancellationToken);
|
|
|
+ var sum = 0.0f;
|
|
|
+
|
|
|
+ var e = source.GetAsyncEnumerator(cancellationToken);
|
|
|
+
|
|
|
+ try
|
|
|
+ {
|
|
|
+ while (await e.MoveNextAsync().ConfigureAwait(false))
|
|
|
+ {
|
|
|
+ var value = selector(e.Current);
|
|
|
+
|
|
|
+ sum += value;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ finally
|
|
|
+ {
|
|
|
+ await e.DisposeAsync().ConfigureAwait(false);
|
|
|
+ }
|
|
|
+
|
|
|
+ return sum;
|
|
|
}
|
|
|
|
|
|
- private static Task<float> SumCore<TSource>(IAsyncEnumerable<TSource> source, Func<TSource, Task<float>> selector, CancellationToken cancellationToken)
|
|
|
+ private static async Task<float> SumCore<TSource>(IAsyncEnumerable<TSource> source, Func<TSource, Task<float>> selector, CancellationToken cancellationToken)
|
|
|
{
|
|
|
- return source.Select(selector).Sum(cancellationToken);
|
|
|
+ var sum = 0.0f;
|
|
|
+
|
|
|
+ var e = source.GetAsyncEnumerator(cancellationToken);
|
|
|
+
|
|
|
+ try
|
|
|
+ {
|
|
|
+ while (await e.MoveNextAsync().ConfigureAwait(false))
|
|
|
+ {
|
|
|
+ var value = await selector(e.Current).ConfigureAwait(false);
|
|
|
+
|
|
|
+ sum += value;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ finally
|
|
|
+ {
|
|
|
+ await e.DisposeAsync().ConfigureAwait(false);
|
|
|
+ }
|
|
|
+
|
|
|
+ return sum;
|
|
|
}
|
|
|
+
|
|
|
public static Task<double> Sum(this IAsyncEnumerable<double> source)
|
|
|
{
|
|
|
if (source == null)
|
|
@@ -276,20 +453,73 @@ namespace System.Linq
|
|
|
return SumCore(source, selector, cancellationToken);
|
|
|
}
|
|
|
|
|
|
- private static Task<double> SumCore(IAsyncEnumerable<double> source, CancellationToken cancellationToken)
|
|
|
+ private static async Task<double> SumCore(IAsyncEnumerable<double> source, CancellationToken cancellationToken)
|
|
|
{
|
|
|
- return source.Aggregate(0.0, (x, y) => x + y, cancellationToken);
|
|
|
+ var sum = 0.0;
|
|
|
+
|
|
|
+ var e = source.GetAsyncEnumerator(cancellationToken);
|
|
|
+
|
|
|
+ try
|
|
|
+ {
|
|
|
+ while (await e.MoveNextAsync().ConfigureAwait(false))
|
|
|
+ {
|
|
|
+ sum += e.Current;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ finally
|
|
|
+ {
|
|
|
+ await e.DisposeAsync().ConfigureAwait(false);
|
|
|
+ }
|
|
|
+
|
|
|
+ return sum;
|
|
|
}
|
|
|
|
|
|
- private static Task<double> SumCore<TSource>(IAsyncEnumerable<TSource> source, Func<TSource, double> selector, CancellationToken cancellationToken)
|
|
|
+ private static async Task<double> SumCore<TSource>(IAsyncEnumerable<TSource> source, Func<TSource, double> selector, CancellationToken cancellationToken)
|
|
|
{
|
|
|
- return source.Select(selector).Sum(cancellationToken);
|
|
|
+ var sum = 0.0;
|
|
|
+
|
|
|
+ var e = source.GetAsyncEnumerator(cancellationToken);
|
|
|
+
|
|
|
+ try
|
|
|
+ {
|
|
|
+ while (await e.MoveNextAsync().ConfigureAwait(false))
|
|
|
+ {
|
|
|
+ var value = selector(e.Current);
|
|
|
+
|
|
|
+ sum += value;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ finally
|
|
|
+ {
|
|
|
+ await e.DisposeAsync().ConfigureAwait(false);
|
|
|
+ }
|
|
|
+
|
|
|
+ return sum;
|
|
|
}
|
|
|
|
|
|
- private static Task<double> SumCore<TSource>(IAsyncEnumerable<TSource> source, Func<TSource, Task<double>> selector, CancellationToken cancellationToken)
|
|
|
+ private static async Task<double> SumCore<TSource>(IAsyncEnumerable<TSource> source, Func<TSource, Task<double>> selector, CancellationToken cancellationToken)
|
|
|
{
|
|
|
- return source.Select(selector).Sum(cancellationToken);
|
|
|
+ var sum = 0.0;
|
|
|
+
|
|
|
+ var e = source.GetAsyncEnumerator(cancellationToken);
|
|
|
+
|
|
|
+ try
|
|
|
+ {
|
|
|
+ while (await e.MoveNextAsync().ConfigureAwait(false))
|
|
|
+ {
|
|
|
+ var value = await selector(e.Current).ConfigureAwait(false);
|
|
|
+
|
|
|
+ sum += value;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ finally
|
|
|
+ {
|
|
|
+ await e.DisposeAsync().ConfigureAwait(false);
|
|
|
+ }
|
|
|
+
|
|
|
+ return sum;
|
|
|
}
|
|
|
+
|
|
|
public static Task<decimal> Sum(this IAsyncEnumerable<decimal> source)
|
|
|
{
|
|
|
if (source == null)
|
|
@@ -346,20 +576,73 @@ namespace System.Linq
|
|
|
return SumCore(source, selector, cancellationToken);
|
|
|
}
|
|
|
|
|
|
- private static Task<decimal> SumCore(IAsyncEnumerable<decimal> source, CancellationToken cancellationToken)
|
|
|
+ private static async Task<decimal> SumCore(IAsyncEnumerable<decimal> source, CancellationToken cancellationToken)
|
|
|
{
|
|
|
- return source.Aggregate(0m, (x, y) => x + y, cancellationToken);
|
|
|
+ var sum = 0m;
|
|
|
+
|
|
|
+ var e = source.GetAsyncEnumerator(cancellationToken);
|
|
|
+
|
|
|
+ try
|
|
|
+ {
|
|
|
+ while (await e.MoveNextAsync().ConfigureAwait(false))
|
|
|
+ {
|
|
|
+ sum += e.Current;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ finally
|
|
|
+ {
|
|
|
+ await e.DisposeAsync().ConfigureAwait(false);
|
|
|
+ }
|
|
|
+
|
|
|
+ return sum;
|
|
|
}
|
|
|
|
|
|
- private static Task<decimal> SumCore<TSource>(IAsyncEnumerable<TSource> source, Func<TSource, decimal> selector, CancellationToken cancellationToken)
|
|
|
+ private static async Task<decimal> SumCore<TSource>(IAsyncEnumerable<TSource> source, Func<TSource, decimal> selector, CancellationToken cancellationToken)
|
|
|
{
|
|
|
- return source.Select(selector).Sum(cancellationToken);
|
|
|
+ var sum = 0m;
|
|
|
+
|
|
|
+ var e = source.GetAsyncEnumerator(cancellationToken);
|
|
|
+
|
|
|
+ try
|
|
|
+ {
|
|
|
+ while (await e.MoveNextAsync().ConfigureAwait(false))
|
|
|
+ {
|
|
|
+ var value = selector(e.Current);
|
|
|
+
|
|
|
+ sum += value;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ finally
|
|
|
+ {
|
|
|
+ await e.DisposeAsync().ConfigureAwait(false);
|
|
|
+ }
|
|
|
+
|
|
|
+ return sum;
|
|
|
}
|
|
|
|
|
|
- private static Task<decimal> SumCore<TSource>(IAsyncEnumerable<TSource> source, Func<TSource, Task<decimal>> selector, CancellationToken cancellationToken)
|
|
|
+ private static async Task<decimal> SumCore<TSource>(IAsyncEnumerable<TSource> source, Func<TSource, Task<decimal>> selector, CancellationToken cancellationToken)
|
|
|
{
|
|
|
- return source.Select(selector).Sum(cancellationToken);
|
|
|
+ var sum = 0m;
|
|
|
+
|
|
|
+ var e = source.GetAsyncEnumerator(cancellationToken);
|
|
|
+
|
|
|
+ try
|
|
|
+ {
|
|
|
+ while (await e.MoveNextAsync().ConfigureAwait(false))
|
|
|
+ {
|
|
|
+ var value = await selector(e.Current).ConfigureAwait(false);
|
|
|
+
|
|
|
+ sum += value;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ finally
|
|
|
+ {
|
|
|
+ await e.DisposeAsync().ConfigureAwait(false);
|
|
|
+ }
|
|
|
+
|
|
|
+ return sum;
|
|
|
}
|
|
|
+
|
|
|
public static Task<int?> Sum(this IAsyncEnumerable<int?> source)
|
|
|
{
|
|
|
if (source == null)
|
|
@@ -416,20 +699,82 @@ namespace System.Linq
|
|
|
return SumCore(source, selector, cancellationToken);
|
|
|
}
|
|
|
|
|
|
- private static Task<int?> SumCore(IAsyncEnumerable<int?> source, CancellationToken cancellationToken)
|
|
|
+ private static async Task<int?> SumCore(IAsyncEnumerable<int?> source, CancellationToken cancellationToken)
|
|
|
{
|
|
|
- return source.Aggregate((int?)0, (x, y) => x + y.GetValueOrDefault(), cancellationToken);
|
|
|
+ var sum = 0;
|
|
|
+
|
|
|
+ var e = source.GetAsyncEnumerator(cancellationToken);
|
|
|
+
|
|
|
+ try
|
|
|
+ {
|
|
|
+ while (await e.MoveNextAsync().ConfigureAwait(false))
|
|
|
+ {
|
|
|
+ checked
|
|
|
+ {
|
|
|
+ sum += e.Current.GetValueOrDefault();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ finally
|
|
|
+ {
|
|
|
+ await e.DisposeAsync().ConfigureAwait(false);
|
|
|
+ }
|
|
|
+
|
|
|
+ return sum;
|
|
|
}
|
|
|
|
|
|
- private static Task<int?> SumCore<TSource>(IAsyncEnumerable<TSource> source, Func<TSource, int?> selector, CancellationToken cancellationToken)
|
|
|
+ private static async Task<int?> SumCore<TSource>(IAsyncEnumerable<TSource> source, Func<TSource, int?> selector, CancellationToken cancellationToken)
|
|
|
{
|
|
|
- return source.Select(selector).Sum(cancellationToken);
|
|
|
+ var sum = 0;
|
|
|
+
|
|
|
+ var e = source.GetAsyncEnumerator(cancellationToken);
|
|
|
+
|
|
|
+ try
|
|
|
+ {
|
|
|
+ while (await e.MoveNextAsync().ConfigureAwait(false))
|
|
|
+ {
|
|
|
+ var value = selector(e.Current);
|
|
|
+
|
|
|
+ checked
|
|
|
+ {
|
|
|
+ sum += value.GetValueOrDefault();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ finally
|
|
|
+ {
|
|
|
+ await e.DisposeAsync().ConfigureAwait(false);
|
|
|
+ }
|
|
|
+
|
|
|
+ return sum;
|
|
|
}
|
|
|
|
|
|
- private static Task<int?> SumCore<TSource>(IAsyncEnumerable<TSource> source, Func<TSource, Task<int?>> selector, CancellationToken cancellationToken)
|
|
|
+ private static async Task<int?> SumCore<TSource>(IAsyncEnumerable<TSource> source, Func<TSource, Task<int?>> selector, CancellationToken cancellationToken)
|
|
|
{
|
|
|
- return source.Select(selector).Sum(cancellationToken);
|
|
|
+ var sum = 0;
|
|
|
+
|
|
|
+ var e = source.GetAsyncEnumerator(cancellationToken);
|
|
|
+
|
|
|
+ try
|
|
|
+ {
|
|
|
+ while (await e.MoveNextAsync().ConfigureAwait(false))
|
|
|
+ {
|
|
|
+ var value = await selector(e.Current).ConfigureAwait(false);
|
|
|
+
|
|
|
+ checked
|
|
|
+ {
|
|
|
+ sum += value.GetValueOrDefault();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ finally
|
|
|
+ {
|
|
|
+ await e.DisposeAsync().ConfigureAwait(false);
|
|
|
+ }
|
|
|
+
|
|
|
+ return sum;
|
|
|
}
|
|
|
+
|
|
|
public static Task<long?> Sum(this IAsyncEnumerable<long?> source)
|
|
|
{
|
|
|
if (source == null)
|
|
@@ -486,20 +831,82 @@ namespace System.Linq
|
|
|
return SumCore(source, selector, cancellationToken);
|
|
|
}
|
|
|
|
|
|
- private static Task<long?> SumCore(IAsyncEnumerable<long?> source, CancellationToken cancellationToken)
|
|
|
+ private static async Task<long?> SumCore(IAsyncEnumerable<long?> source, CancellationToken cancellationToken)
|
|
|
{
|
|
|
- return source.Aggregate((long?)0L, (x, y) => x + y.GetValueOrDefault(), cancellationToken);
|
|
|
+ var sum = 0L;
|
|
|
+
|
|
|
+ var e = source.GetAsyncEnumerator(cancellationToken);
|
|
|
+
|
|
|
+ try
|
|
|
+ {
|
|
|
+ while (await e.MoveNextAsync().ConfigureAwait(false))
|
|
|
+ {
|
|
|
+ checked
|
|
|
+ {
|
|
|
+ sum += e.Current.GetValueOrDefault();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ finally
|
|
|
+ {
|
|
|
+ await e.DisposeAsync().ConfigureAwait(false);
|
|
|
+ }
|
|
|
+
|
|
|
+ return sum;
|
|
|
}
|
|
|
|
|
|
- private static Task<long?> SumCore<TSource>(IAsyncEnumerable<TSource> source, Func<TSource, long?> selector, CancellationToken cancellationToken)
|
|
|
+ private static async Task<long?> SumCore<TSource>(IAsyncEnumerable<TSource> source, Func<TSource, long?> selector, CancellationToken cancellationToken)
|
|
|
{
|
|
|
- return source.Select(selector).Sum(cancellationToken);
|
|
|
+ var sum = 0L;
|
|
|
+
|
|
|
+ var e = source.GetAsyncEnumerator(cancellationToken);
|
|
|
+
|
|
|
+ try
|
|
|
+ {
|
|
|
+ while (await e.MoveNextAsync().ConfigureAwait(false))
|
|
|
+ {
|
|
|
+ var value = selector(e.Current);
|
|
|
+
|
|
|
+ checked
|
|
|
+ {
|
|
|
+ sum += value.GetValueOrDefault();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ finally
|
|
|
+ {
|
|
|
+ await e.DisposeAsync().ConfigureAwait(false);
|
|
|
+ }
|
|
|
+
|
|
|
+ return sum;
|
|
|
}
|
|
|
|
|
|
- private static Task<long?> SumCore<TSource>(IAsyncEnumerable<TSource> source, Func<TSource, Task<long?>> selector, CancellationToken cancellationToken)
|
|
|
+ private static async Task<long?> SumCore<TSource>(IAsyncEnumerable<TSource> source, Func<TSource, Task<long?>> selector, CancellationToken cancellationToken)
|
|
|
{
|
|
|
- return source.Select(selector).Sum(cancellationToken);
|
|
|
+ var sum = 0L;
|
|
|
+
|
|
|
+ var e = source.GetAsyncEnumerator(cancellationToken);
|
|
|
+
|
|
|
+ try
|
|
|
+ {
|
|
|
+ while (await e.MoveNextAsync().ConfigureAwait(false))
|
|
|
+ {
|
|
|
+ var value = await selector(e.Current).ConfigureAwait(false);
|
|
|
+
|
|
|
+ checked
|
|
|
+ {
|
|
|
+ sum += value.GetValueOrDefault();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ finally
|
|
|
+ {
|
|
|
+ await e.DisposeAsync().ConfigureAwait(false);
|
|
|
+ }
|
|
|
+
|
|
|
+ return sum;
|
|
|
}
|
|
|
+
|
|
|
public static Task<float?> Sum(this IAsyncEnumerable<float?> source)
|
|
|
{
|
|
|
if (source == null)
|
|
@@ -556,20 +963,73 @@ namespace System.Linq
|
|
|
return SumCore(source, selector, cancellationToken);
|
|
|
}
|
|
|
|
|
|
- private static Task<float?> SumCore(IAsyncEnumerable<float?> source, CancellationToken cancellationToken)
|
|
|
+ private static async Task<float?> SumCore(IAsyncEnumerable<float?> source, CancellationToken cancellationToken)
|
|
|
{
|
|
|
- return source.Aggregate((float?)0.0f, (x, y) => x + y.GetValueOrDefault(), cancellationToken);
|
|
|
+ var sum = 0.0f;
|
|
|
+
|
|
|
+ var e = source.GetAsyncEnumerator(cancellationToken);
|
|
|
+
|
|
|
+ try
|
|
|
+ {
|
|
|
+ while (await e.MoveNextAsync().ConfigureAwait(false))
|
|
|
+ {
|
|
|
+ sum += e.Current.GetValueOrDefault();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ finally
|
|
|
+ {
|
|
|
+ await e.DisposeAsync().ConfigureAwait(false);
|
|
|
+ }
|
|
|
+
|
|
|
+ return sum;
|
|
|
}
|
|
|
|
|
|
- private static Task<float?> SumCore<TSource>(IAsyncEnumerable<TSource> source, Func<TSource, float?> selector, CancellationToken cancellationToken)
|
|
|
+ private static async Task<float?> SumCore<TSource>(IAsyncEnumerable<TSource> source, Func<TSource, float?> selector, CancellationToken cancellationToken)
|
|
|
{
|
|
|
- return source.Select(selector).Sum(cancellationToken);
|
|
|
+ var sum = 0.0f;
|
|
|
+
|
|
|
+ var e = source.GetAsyncEnumerator(cancellationToken);
|
|
|
+
|
|
|
+ try
|
|
|
+ {
|
|
|
+ while (await e.MoveNextAsync().ConfigureAwait(false))
|
|
|
+ {
|
|
|
+ var value = selector(e.Current);
|
|
|
+
|
|
|
+ sum += value.GetValueOrDefault();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ finally
|
|
|
+ {
|
|
|
+ await e.DisposeAsync().ConfigureAwait(false);
|
|
|
+ }
|
|
|
+
|
|
|
+ return sum;
|
|
|
}
|
|
|
|
|
|
- private static Task<float?> SumCore<TSource>(IAsyncEnumerable<TSource> source, Func<TSource, Task<float?>> selector, CancellationToken cancellationToken)
|
|
|
+ private static async Task<float?> SumCore<TSource>(IAsyncEnumerable<TSource> source, Func<TSource, Task<float?>> selector, CancellationToken cancellationToken)
|
|
|
{
|
|
|
- return source.Select(selector).Sum(cancellationToken);
|
|
|
+ var sum = 0.0f;
|
|
|
+
|
|
|
+ var e = source.GetAsyncEnumerator(cancellationToken);
|
|
|
+
|
|
|
+ try
|
|
|
+ {
|
|
|
+ while (await e.MoveNextAsync().ConfigureAwait(false))
|
|
|
+ {
|
|
|
+ var value = await selector(e.Current).ConfigureAwait(false);
|
|
|
+
|
|
|
+ sum += value.GetValueOrDefault();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ finally
|
|
|
+ {
|
|
|
+ await e.DisposeAsync().ConfigureAwait(false);
|
|
|
+ }
|
|
|
+
|
|
|
+ return sum;
|
|
|
}
|
|
|
+
|
|
|
public static Task<double?> Sum(this IAsyncEnumerable<double?> source)
|
|
|
{
|
|
|
if (source == null)
|
|
@@ -626,20 +1086,73 @@ namespace System.Linq
|
|
|
return SumCore(source, selector, cancellationToken);
|
|
|
}
|
|
|
|
|
|
- private static Task<double?> SumCore(IAsyncEnumerable<double?> source, CancellationToken cancellationToken)
|
|
|
+ private static async Task<double?> SumCore(IAsyncEnumerable<double?> source, CancellationToken cancellationToken)
|
|
|
{
|
|
|
- return source.Aggregate((double?)0.0, (x, y) => x + y.GetValueOrDefault(), cancellationToken);
|
|
|
+ var sum = 0.0;
|
|
|
+
|
|
|
+ var e = source.GetAsyncEnumerator(cancellationToken);
|
|
|
+
|
|
|
+ try
|
|
|
+ {
|
|
|
+ while (await e.MoveNextAsync().ConfigureAwait(false))
|
|
|
+ {
|
|
|
+ sum += e.Current.GetValueOrDefault();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ finally
|
|
|
+ {
|
|
|
+ await e.DisposeAsync().ConfigureAwait(false);
|
|
|
+ }
|
|
|
+
|
|
|
+ return sum;
|
|
|
}
|
|
|
|
|
|
- private static Task<double?> SumCore<TSource>(IAsyncEnumerable<TSource> source, Func<TSource, double?> selector, CancellationToken cancellationToken)
|
|
|
+ private static async Task<double?> SumCore<TSource>(IAsyncEnumerable<TSource> source, Func<TSource, double?> selector, CancellationToken cancellationToken)
|
|
|
{
|
|
|
- return source.Select(selector).Sum(cancellationToken);
|
|
|
+ var sum = 0.0;
|
|
|
+
|
|
|
+ var e = source.GetAsyncEnumerator(cancellationToken);
|
|
|
+
|
|
|
+ try
|
|
|
+ {
|
|
|
+ while (await e.MoveNextAsync().ConfigureAwait(false))
|
|
|
+ {
|
|
|
+ var value = selector(e.Current);
|
|
|
+
|
|
|
+ sum += value.GetValueOrDefault();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ finally
|
|
|
+ {
|
|
|
+ await e.DisposeAsync().ConfigureAwait(false);
|
|
|
+ }
|
|
|
+
|
|
|
+ return sum;
|
|
|
}
|
|
|
|
|
|
- private static Task<double?> SumCore<TSource>(IAsyncEnumerable<TSource> source, Func<TSource, Task<double?>> selector, CancellationToken cancellationToken)
|
|
|
+ private static async Task<double?> SumCore<TSource>(IAsyncEnumerable<TSource> source, Func<TSource, Task<double?>> selector, CancellationToken cancellationToken)
|
|
|
{
|
|
|
- return source.Select(selector).Sum(cancellationToken);
|
|
|
+ var sum = 0.0;
|
|
|
+
|
|
|
+ var e = source.GetAsyncEnumerator(cancellationToken);
|
|
|
+
|
|
|
+ try
|
|
|
+ {
|
|
|
+ while (await e.MoveNextAsync().ConfigureAwait(false))
|
|
|
+ {
|
|
|
+ var value = await selector(e.Current).ConfigureAwait(false);
|
|
|
+
|
|
|
+ sum += value.GetValueOrDefault();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ finally
|
|
|
+ {
|
|
|
+ await e.DisposeAsync().ConfigureAwait(false);
|
|
|
+ }
|
|
|
+
|
|
|
+ return sum;
|
|
|
}
|
|
|
+
|
|
|
public static Task<decimal?> Sum(this IAsyncEnumerable<decimal?> source)
|
|
|
{
|
|
|
if (source == null)
|
|
@@ -696,19 +1209,72 @@ namespace System.Linq
|
|
|
return SumCore(source, selector, cancellationToken);
|
|
|
}
|
|
|
|
|
|
- private static Task<decimal?> SumCore(IAsyncEnumerable<decimal?> source, CancellationToken cancellationToken)
|
|
|
+ private static async Task<decimal?> SumCore(IAsyncEnumerable<decimal?> source, CancellationToken cancellationToken)
|
|
|
{
|
|
|
- return source.Aggregate((decimal?)0m, (x, y) => x + y.GetValueOrDefault(), cancellationToken);
|
|
|
+ var sum = 0m;
|
|
|
+
|
|
|
+ var e = source.GetAsyncEnumerator(cancellationToken);
|
|
|
+
|
|
|
+ try
|
|
|
+ {
|
|
|
+ while (await e.MoveNextAsync().ConfigureAwait(false))
|
|
|
+ {
|
|
|
+ sum += e.Current.GetValueOrDefault();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ finally
|
|
|
+ {
|
|
|
+ await e.DisposeAsync().ConfigureAwait(false);
|
|
|
+ }
|
|
|
+
|
|
|
+ return sum;
|
|
|
}
|
|
|
|
|
|
- private static Task<decimal?> SumCore<TSource>(IAsyncEnumerable<TSource> source, Func<TSource, decimal?> selector, CancellationToken cancellationToken)
|
|
|
+ private static async Task<decimal?> SumCore<TSource>(IAsyncEnumerable<TSource> source, Func<TSource, decimal?> selector, CancellationToken cancellationToken)
|
|
|
{
|
|
|
- return source.Select(selector).Sum(cancellationToken);
|
|
|
+ var sum = 0m;
|
|
|
+
|
|
|
+ var e = source.GetAsyncEnumerator(cancellationToken);
|
|
|
+
|
|
|
+ try
|
|
|
+ {
|
|
|
+ while (await e.MoveNextAsync().ConfigureAwait(false))
|
|
|
+ {
|
|
|
+ var value = selector(e.Current);
|
|
|
+
|
|
|
+ sum += value.GetValueOrDefault();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ finally
|
|
|
+ {
|
|
|
+ await e.DisposeAsync().ConfigureAwait(false);
|
|
|
+ }
|
|
|
+
|
|
|
+ return sum;
|
|
|
}
|
|
|
|
|
|
- private static Task<decimal?> SumCore<TSource>(IAsyncEnumerable<TSource> source, Func<TSource, Task<decimal?>> selector, CancellationToken cancellationToken)
|
|
|
+ private static async Task<decimal?> SumCore<TSource>(IAsyncEnumerable<TSource> source, Func<TSource, Task<decimal?>> selector, CancellationToken cancellationToken)
|
|
|
{
|
|
|
- return source.Select(selector).Sum(cancellationToken);
|
|
|
+ var sum = 0m;
|
|
|
+
|
|
|
+ var e = source.GetAsyncEnumerator(cancellationToken);
|
|
|
+
|
|
|
+ try
|
|
|
+ {
|
|
|
+ while (await e.MoveNextAsync().ConfigureAwait(false))
|
|
|
+ {
|
|
|
+ var value = await selector(e.Current).ConfigureAwait(false);
|
|
|
+
|
|
|
+ sum += value.GetValueOrDefault();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ finally
|
|
|
+ {
|
|
|
+ await e.DisposeAsync().ConfigureAwait(false);
|
|
|
+ }
|
|
|
+
|
|
|
+ return sum;
|
|
|
}
|
|
|
+
|
|
|
}
|
|
|
}
|