Ver código fonte

Fix loop to go to while if no grouping exists for item

Oren Novotny 9 anos atrás
pai
commit
9f86e40e07

+ 7 - 4
Ix.NET/Source/System.Interactive.Async/Join.cs

@@ -97,7 +97,7 @@ namespace System.Linq
             TOuter item;
             private int mode;
 
-            const int State_Begin = 1;
+            const int State_If = 1;
             const int State_DoLoop = 2;
             const int State_For = 3;
             const int State_While = 4;
@@ -108,18 +108,19 @@ namespace System.Linq
                 {
                     case AsyncIteratorState.Allocated:
                         outerEnumerator = outer.GetEnumerator();
-                        mode = State_Begin;
+                        mode = State_If;
                         state = AsyncIteratorState.Iterating;
                         goto case AsyncIteratorState.Iterating;
 
                     case AsyncIteratorState.Iterating:
                         switch (mode)
                         {
-                            case State_Begin:
+                            case State_If:
                                 if (await outerEnumerator.MoveNext(cancellationToken)
                                                          .ConfigureAwait(false))
                                 {
                                     lookup = await Internal.Lookup<TKey, TInner>.CreateForJoinAsync(inner, innerKeySelector, comparer, cancellationToken).ConfigureAwait(false);
+
                                     if (lookup.Count != 0)
                                     {
                                         mode = State_DoLoop;
@@ -140,7 +141,9 @@ namespace System.Linq
                                     goto case State_For;
                                 }
 
-                                break;
+                                // advance to while
+                                mode = State_While;
+                                goto case State_While;
 
                             case State_For:
                                 current = resultSelector(item, elements[index]);

+ 33 - 0
Ix.NET/Source/Tests/AsyncTests.Multiple.cs

@@ -925,6 +925,39 @@ namespace Tests
             NoNext(e);
         }
 
+        [Fact]
+        public void Join12()
+        {
+            var customers = new List<Customer>
+            {
+                new Customer {CustomerId = "ANANT"},
+                new Customer {CustomerId = "ALFKI"},
+                new Customer {CustomerId = "FISSA"}
+            };
+            var orders = new List<Order>
+            {
+                new Order { OrderId = 1, CustomerId = "ALFKI"},
+                new Order { OrderId = 2, CustomerId = "ALFKI"},
+                new Order { OrderId = 3, CustomerId = "ALFKI"},
+                new Order { OrderId = 4, CustomerId = "FISSA"},
+                new Order { OrderId = 5, CustomerId = "FISSA"},
+                new Order { OrderId = 6, CustomerId = "FISSA"},
+            };
+
+            var asyncResult = customers.ToAsyncEnumerable()
+                                       .Join(orders.ToAsyncEnumerable(), c => c.CustomerId, o => o.CustomerId,
+                                            (c, o) => new CustomerOrder { CustomerId = c.CustomerId, OrderId = o.OrderId });
+
+            var e = asyncResult.GetEnumerator();
+            HasNext(e, new CustomerOrder { CustomerId = "ALFKI", OrderId = 1 });
+            HasNext(e, new CustomerOrder { CustomerId = "ALFKI", OrderId = 2 });
+            HasNext(e, new CustomerOrder { CustomerId = "ALFKI", OrderId = 3 });
+            HasNext(e, new CustomerOrder { CustomerId = "FISSA", OrderId = 4 });
+            HasNext(e, new CustomerOrder { CustomerId = "FISSA", OrderId = 5 });
+            HasNext(e, new CustomerOrder { CustomerId = "FISSA", OrderId = 6 });
+            NoNext(e);
+        }
+
 
         [Fact]
         public void SelectManyMultiple_Null()