|
@@ -66,62 +66,6 @@ namespace System.Linq
|
|
|
return source.Where(predicate).Single(cancellationToken);
|
|
|
}
|
|
|
|
|
|
- public static Task<TSource> SingleOrDefault<TSource>(this IAsyncEnumerable<TSource> source)
|
|
|
- {
|
|
|
- if (source == null)
|
|
|
- throw new ArgumentNullException(nameof(source));
|
|
|
-
|
|
|
- return SingleOrDefault(source, CancellationToken.None);
|
|
|
- }
|
|
|
-
|
|
|
- public static Task<TSource> SingleOrDefault<TSource>(this IAsyncEnumerable<TSource> source, CancellationToken cancellationToken)
|
|
|
- {
|
|
|
- if (source == null)
|
|
|
- throw new ArgumentNullException(nameof(source));
|
|
|
-
|
|
|
- return SingleOrDefault_(source, cancellationToken);
|
|
|
- }
|
|
|
-
|
|
|
- public static Task<TSource> SingleOrDefault<TSource>(this IAsyncEnumerable<TSource> source, Func<TSource, bool> predicate)
|
|
|
- {
|
|
|
- if (source == null)
|
|
|
- throw new ArgumentNullException(nameof(source));
|
|
|
- if (predicate == null)
|
|
|
- throw new ArgumentNullException(nameof(predicate));
|
|
|
-
|
|
|
- return SingleOrDefault(source, predicate, CancellationToken.None);
|
|
|
- }
|
|
|
-
|
|
|
- public static Task<TSource> SingleOrDefault<TSource>(this IAsyncEnumerable<TSource> source, Func<TSource, bool> predicate, CancellationToken cancellationToken)
|
|
|
- {
|
|
|
- if (source == null)
|
|
|
- throw new ArgumentNullException(nameof(source));
|
|
|
- if (predicate == null)
|
|
|
- throw new ArgumentNullException(nameof(predicate));
|
|
|
-
|
|
|
- return source.Where(predicate).SingleOrDefault(cancellationToken);
|
|
|
- }
|
|
|
-
|
|
|
- public static Task<TSource> SingleOrDefault<TSource>(this IAsyncEnumerable<TSource> source, Func<TSource, Task<bool>> predicate)
|
|
|
- {
|
|
|
- if (source == null)
|
|
|
- throw new ArgumentNullException(nameof(source));
|
|
|
- if (predicate == null)
|
|
|
- throw new ArgumentNullException(nameof(predicate));
|
|
|
-
|
|
|
- return SingleOrDefault(source, predicate, CancellationToken.None);
|
|
|
- }
|
|
|
-
|
|
|
- public static Task<TSource> SingleOrDefault<TSource>(this IAsyncEnumerable<TSource> source, Func<TSource, Task<bool>> predicate, CancellationToken cancellationToken)
|
|
|
- {
|
|
|
- if (source == null)
|
|
|
- throw new ArgumentNullException(nameof(source));
|
|
|
- if (predicate == null)
|
|
|
- throw new ArgumentNullException(nameof(predicate));
|
|
|
-
|
|
|
- return source.Where(predicate).SingleOrDefault(cancellationToken);
|
|
|
- }
|
|
|
-
|
|
|
private static async Task<TSource> Single_<TSource>(IAsyncEnumerable<TSource> source, CancellationToken cancellationToken)
|
|
|
{
|
|
|
if (source is IList<TSource> list)
|
|
@@ -157,41 +101,5 @@ namespace System.Linq
|
|
|
await e.DisposeAsync().ConfigureAwait(false);
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
- private static async Task<TSource> SingleOrDefault_<TSource>(IAsyncEnumerable<TSource> source, CancellationToken cancellationToken)
|
|
|
- {
|
|
|
- if (source is IList<TSource> list)
|
|
|
- {
|
|
|
- switch (list.Count)
|
|
|
- {
|
|
|
- case 0: return default(TSource);
|
|
|
- case 1: return list[0];
|
|
|
- }
|
|
|
-
|
|
|
- throw new InvalidOperationException(Strings.MORE_THAN_ONE_ELEMENT);
|
|
|
- }
|
|
|
-
|
|
|
- var e = source.GetAsyncEnumerator();
|
|
|
-
|
|
|
- try
|
|
|
- {
|
|
|
- if (!await e.MoveNextAsync(cancellationToken).ConfigureAwait(false))
|
|
|
- {
|
|
|
- return default(TSource);
|
|
|
- }
|
|
|
-
|
|
|
- var result = e.Current;
|
|
|
- if (!await e.MoveNextAsync(cancellationToken).ConfigureAwait(false))
|
|
|
- {
|
|
|
- return result;
|
|
|
- }
|
|
|
- }
|
|
|
- finally
|
|
|
- {
|
|
|
- await e.DisposeAsync().ConfigureAwait(false);
|
|
|
- }
|
|
|
-
|
|
|
- throw new InvalidOperationException(Strings.MORE_THAN_ONE_ELEMENT);
|
|
|
- }
|
|
|
}
|
|
|
}
|