Издатель / Подписчик в LINQ? - PullRequest
1 голос
/ 08 февраля 2011

Проблема:

    IEnumerable<Signal> feed = GetFeed();

var average1 = feed.MovingAverage(10);
var average2 = feed.MovingAverage(20);

var zipped = average1.Zip(average2, (x,y) => Tuple.Create(x,y));

Когда я перебираю zip, GetFeed (). GetEnumerator () вызывается дважды и создает всевозможные проблемы с синхронизацией. Есть ли оператор LINQ, который можно использовать для передачи значений от одного производителя нескольким потребителям? Я знаю о Memoize, но в моем случае я не могу предсказать размер буфера, чтобы медленные и быстрые потребители были «счастливы».

Я думаю написать собственный оператор, который будет хранить отдельные очереди для каждого потребителя, но хотел проверить, существует ли существующее решение.

1 Ответ

3 голосов
/ 08 февраля 2011

То, что вы хотите, это Реактивные расширения . Это как LINQ to Objects, но наоборот: вы не извлекаете значения, они проталкивают через наблюдателей.

Требуется некоторое время, чтобы привыкнуть к этому, но, судя по тому, что вы написали, это именно та модель, которая вам подходит.

...