Skip to content

Commit 9f86e40

Browse files
author
Oren Novotny
committed
Fix loop to go to while if no grouping exists for item
1 parent 6d3bba0 commit 9f86e40

File tree

2 files changed

+40
-4
lines changed

2 files changed

+40
-4
lines changed

Ix.NET/Source/System.Interactive.Async/Join.cs

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@ public override void Dispose()
9797
TOuter item;
9898
private int mode;
9999

100-
const int State_Begin = 1;
100+
const int State_If = 1;
101101
const int State_DoLoop = 2;
102102
const int State_For = 3;
103103
const int State_While = 4;
@@ -108,18 +108,19 @@ protected override async Task<bool> MoveNextCore(CancellationToken cancellationT
108108
{
109109
case AsyncIteratorState.Allocated:
110110
outerEnumerator = outer.GetEnumerator();
111-
mode = State_Begin;
111+
mode = State_If;
112112
state = AsyncIteratorState.Iterating;
113113
goto case AsyncIteratorState.Iterating;
114114

115115
case AsyncIteratorState.Iterating:
116116
switch (mode)
117117
{
118-
case State_Begin:
118+
case State_If:
119119
if (await outerEnumerator.MoveNext(cancellationToken)
120120
.ConfigureAwait(false))
121121
{
122122
lookup = await Internal.Lookup<TKey, TInner>.CreateForJoinAsync(inner, innerKeySelector, comparer, cancellationToken).ConfigureAwait(false);
123+
123124
if (lookup.Count != 0)
124125
{
125126
mode = State_DoLoop;
@@ -140,7 +141,9 @@ protected override async Task<bool> MoveNextCore(CancellationToken cancellationT
140141
goto case State_For;
141142
}
142143

143-
break;
144+
// advance to while
145+
mode = State_While;
146+
goto case State_While;
144147

145148
case State_For:
146149
current = resultSelector(item, elements[index]);

Ix.NET/Source/Tests/AsyncTests.Multiple.cs

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -925,6 +925,39 @@ public void Join11()
925925
NoNext(e);
926926
}
927927

928+
[Fact]
929+
public void Join12()
930+
{
931+
var customers = new List<Customer>
932+
{
933+
new Customer {CustomerId = "ANANT"},
934+
new Customer {CustomerId = "ALFKI"},
935+
new Customer {CustomerId = "FISSA"}
936+
};
937+
var orders = new List<Order>
938+
{
939+
new Order { OrderId = 1, CustomerId = "ALFKI"},
940+
new Order { OrderId = 2, CustomerId = "ALFKI"},
941+
new Order { OrderId = 3, CustomerId = "ALFKI"},
942+
new Order { OrderId = 4, CustomerId = "FISSA"},
943+
new Order { OrderId = 5, CustomerId = "FISSA"},
944+
new Order { OrderId = 6, CustomerId = "FISSA"},
945+
};
946+
947+
var asyncResult = customers.ToAsyncEnumerable()
948+
.Join(orders.ToAsyncEnumerable(), c => c.CustomerId, o => o.CustomerId,
949+
(c, o) => new CustomerOrder { CustomerId = c.CustomerId, OrderId = o.OrderId });
950+
951+
var e = asyncResult.GetEnumerator();
952+
HasNext(e, new CustomerOrder { CustomerId = "ALFKI", OrderId = 1 });
953+
HasNext(e, new CustomerOrder { CustomerId = "ALFKI", OrderId = 2 });
954+
HasNext(e, new CustomerOrder { CustomerId = "ALFKI", OrderId = 3 });
955+
HasNext(e, new CustomerOrder { CustomerId = "FISSA", OrderId = 4 });
956+
HasNext(e, new CustomerOrder { CustomerId = "FISSA", OrderId = 5 });
957+
HasNext(e, new CustomerOrder { CustomerId = "FISSA", OrderId = 6 });
958+
NoNext(e);
959+
}
960+
928961

929962
[Fact]
930963
public void SelectManyMultiple_Null()

0 commit comments

Comments
 (0)