Browse Source

Use C# 8.0 in ToDictionary.

Bart De Smet 7 years ago
parent
commit
1640ce2dae

+ 38 - 8
Ix.NET/Source/System.Linq.Async/System/Linq/Operators/ToDictionary.cs

@@ -152,12 +152,21 @@ namespace System.Linq
 
         private static async Task<Dictionary<TKey, TElement>> ToDictionaryCore<TSource, TKey, TElement>(IAsyncEnumerable<TSource> source, Func<TSource, TKey> keySelector, Func<TSource, TElement> elementSelector, IEqualityComparer<TKey> comparer, CancellationToken cancellationToken)
         {
+            var d = new Dictionary<TKey, TElement>(comparer);
+
+#if CSHARP8 && AETOR_HAS_CT // CS0656 Missing compiler required member 'System.Collections.Generic.IAsyncEnumerable`1.GetAsyncEnumerator'
+            await foreach (TSource item in source.WithCancellation(cancellationToken).ConfigureAwait(false))
+            {
+                var key = keySelector(item);
+                var value = elementSelector(item);
+
+                d.Add(key, value);
+            }
+#else
             var e = source.GetAsyncEnumerator(cancellationToken);
 
             try
             {
-                var d = new Dictionary<TKey, TElement>(comparer);
-
                 while (await e.MoveNextAsync().ConfigureAwait(false))
                 {
                     var x = e.Current;
@@ -167,23 +176,33 @@ namespace System.Linq
 
                     d.Add(key, value);
                 }
-
-                return d;
             }
             finally
             {
                 await e.DisposeAsync().ConfigureAwait(false);
             }
+#endif
+
+            return d;
         }
 
         private static async Task<Dictionary<TKey, TElement>> ToDictionaryCore<TSource, TKey, TElement>(IAsyncEnumerable<TSource> source, Func<TSource, ValueTask<TKey>> keySelector, Func<TSource, ValueTask<TElement>> elementSelector, IEqualityComparer<TKey> comparer, CancellationToken cancellationToken)
         {
+            var d = new Dictionary<TKey, TElement>(comparer);
+
+#if CSHARP8 && AETOR_HAS_CT // CS0656 Missing compiler required member 'System.Collections.Generic.IAsyncEnumerable`1.GetAsyncEnumerator'
+            await foreach (TSource item in source.WithCancellation(cancellationToken).ConfigureAwait(false))
+            {
+                var key = await keySelector(item).ConfigureAwait(false);
+                var value = await elementSelector(item).ConfigureAwait(false);
+
+                d.Add(key, value);
+            }
+#else
             var e = source.GetAsyncEnumerator(cancellationToken);
 
             try
             {
-                var d = new Dictionary<TKey, TElement>(comparer);
-
                 while (await e.MoveNextAsync().ConfigureAwait(false))
                 {
                     var x = e.Current;
@@ -193,13 +212,14 @@ namespace System.Linq
 
                     d.Add(key, value);
                 }
-
-                return d;
             }
             finally
             {
                 await e.DisposeAsync().ConfigureAwait(false);
             }
+#endif
+
+            return d;
         }
 
 #if !NO_DEEP_CANCELLATION
@@ -207,6 +227,15 @@ namespace System.Linq
         {
             var d = new Dictionary<TKey, TElement>(comparer);
 
+#if CSHARP8 && AETOR_HAS_CT // CS0656 Missing compiler required member 'System.Collections.Generic.IAsyncEnumerable`1.GetAsyncEnumerator'
+            await foreach (TSource item in source.WithCancellation(cancellationToken).ConfigureAwait(false))
+            {
+                var key = await keySelector(item, cancellationToken).ConfigureAwait(false);
+                var value = await elementSelector(item, cancellationToken).ConfigureAwait(false);
+
+                d.Add(key, value);
+            }
+#else
             var e = source.GetAsyncEnumerator(cancellationToken);
 
             try
@@ -225,6 +254,7 @@ namespace System.Linq
             {
                 await e.DisposeAsync().ConfigureAwait(false);
             }
+#endif
 
             return d;
         }