В соответствии с предложением Джима Вули.
Я думаю, что код, который вы просматриваете,
var q = from start in mouseDown
from delta in mouseMove.StartWith(start).Until(mouseUp)
.Let(mm=> mm.Zip(mm.Skip(1), (prev, curr) =>
new { X = curr.X - prev.X, Y = curr.Y - prev.Y}))
select delta;
Помните, что он был написан в 2009 году, и с тех пор Rx продвинулся вперед.Я думаю, что это то, что вы хотите.Я думаю, что Let - это функция, которую вы хотите избежать (даже если она доступна для вас) в Rx, поскольку она может вызывать побочные эффекты.Вместо этого используйте преобразование с помощью Select.В случае ниже, let просто не нужен.
//Gets the delta of positions.
var mouseMovements = mouseMove.Zip(mouseMove.Skip(1), (prev, curr) =>
new { X = curr.X - prev.X, Y = curr.Y - prev.Y}));
//Only streams when mouse is down
var dragging = from md in mouseDown
from mm in mouseMovement.TakeUntil(mouseUp)
select mm;