Я думал, что это легко, но мой мозг сейчас тает ..
Проблема
Учитывая следующее IObservable<int>
Поток:
1
1
0
0
0
1
0
0
1
0
1
Я хочу разделить его на IObservable<IEnumerable<int>>
Поток вида
1
1 0 0 0
1 0 0
1 0
1
поэтому, когда есть 0, он просто добавляется в IEnumerable, а когда появляется 1, запускается новый список; Это немного более точное определение моей реальной проблемы.
Мой подход пока
Я подумал, что хорошим решением было бы сначала преобразовать его в IObservable<IObservable<int>>
с помощью метода Window
, а затем использовать ToEnumerable
, но почему-то у меня не получается работать ... Я использовал Zip
и Skip(1)
, чтобы получить diff до последнего элемента, я тоже использовал 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: немного изменил проблему, чтобы лучше выделить мою проблему, извините. Также обновил мое решение.