Как разделить наблюдаемый поток на куски, в зависимости от второго потока?

Я думал, что это легко, но сейчас мой мозг тает ..

Проблема

Учитывая следующее IObservable Поток: 1 1 0 0 0 1 0 0 1 0 1

Я хочу разделить его на IObservable > поток формы

1

1 0 0 0

1 0 0

1 0

1

поэтому всякий раз, когда есть 0, он просто добавляется в IEnumerable, а когда появляется 1, запускается новый список; Это немного более четкое определение моей реальной проблемы.

Мой подход до сих пор

Я думал, что хорошим решением будет сначала преобразовать его в IObservable > с помощью метода Window , а затем использовать ToEnumerable , но почему-то я не могу заставить его работать .. Я использовал Zip и Skip (1) , чтобы получить разницу для последнего элемента, я использовал DistinctUntilChanged () тоже. Я избавляю вас от всех вариантов, которые я пробовал ...

Вероятно, ближе всего к мне подошел этот код:

int[] ints = new[] { 1, 1, 0, 0, 0, 1, 0, 0, 1, 0, 1 };
var observable = Observable.Interval(TimeSpan.FromMilliseconds(1000)).Take(11).Select(i => ints[i]);

Subject<int> subject = new Subject<int>();
observable.Subscribe(subject);

var observableDiff = subject.Skip(1).Zip(subject, (n, p) => new { Previous = p, Next = n });
var windows = observable.Window(() => observableDiff.Where(x => x.Next == 1));

int index = 0;
windows.Subscribe(window =>
{
  Console.WriteLine(string.Format("new window [{0}] ", index++));
  window.Subscribe(number => Console.WriteLine(number));
});

Он дает хорошие результаты, но, к сожалению, вылетает в конце ..

new window [0]
1
new window [1]
1
0
0
0
new window [2]
1
0
0
new window [3]
1
0
new window [4]
new window [5]
new window [6]
new window [7]
new window [8]
new window [9]
<-- it goes on here until window ~ [80] with a stackoverflow exception

Если бы эта ошибка в моем коде не сработала. не существует, я бы добился этого ...

Любая помощь будет принята с благодарностью. :)

Изменить: я использую Rx-Experimental, но это не имеет значения (проверено с помощью LinqPad). Также удалили тему, ни на что не влияло. Похоже, что с моим новым подходом (Edit2) вам нужна тема, иначе начало окон будет совершенно странным.

Edit2: немного изменил проблему, чтобы лучше выделить мою проблему, извините. Также обновил мое решение.

9
задан hko 12 January 2012 в 23:01
поделиться