Вы правы. Вот что делает оператор CombineLatest
:
A: 1...2...3...4...5...
B: a.....b.........c...
Последнее значение любой последовательности сохраняется для создания пары, на которую действует селектор. Выходной поток будет (1,a) (2,a) (2,b) (3,b)
и т. Д.
Если вам нужно создать правильные пары из любого потока, используйте оператор 'Zip', который даст вам (1,a) (2,b) (3,c)
и т. Д.
приписка
Я бы предложил попытаться лучше понять, как компилятор переписывает понимание запросов. Это разрешит большую часть вашей путаницы.
from a in oA
from b in oB
select ...
эффективно SelectMany(oA, oB)