Реактивные расширения: сопряжение значений из IObservable

Данный:

 class CharPair 
 {
     char _a;
     char _b;
     CharPair(char a, char b) { _a = a; _b = b; }
 }

 IObservable<char> keyPresses = ... // a sequence of key presses

Как взять каждые два символа и создать новую IObservable‹CharPair›?

E.g.

 'a','1','b','2','c','3','d','4'
    -> 
 CharPair('a','1'),CharPair('b','2'),CharPair('c','3'),CharPair('d','4')

Пока у меня есть следующее, но это кажется довольно длинным, можно ли его улучшить?

 IObservable<char> keyPresses = KeyPresses().ToObservable().Publish();

 var odds = keyPresses.Where((_,i) => (i&1) == 1);
 var evens = keyPresses.Where((_,i) => (i&1) == 0);

 IObservable<CharPair> charPairs = evens.Zip(odds, (e, o) => new CharPair(e,o));

person chillitom    schedule 27.01.2011    source источник


Ответы (1)


BufferWithCount должен помочь, вы можете сделать что-то вроде этого:

var keyPressed = Observable.Create<ConsoleKey>(
    o =>
        {
            while (true)
            {
                var consoleKeyInfo = Console.ReadKey(true);
                o.OnNext(consoleKeyInfo.Key);
            }
        }
    );

var paired = keyPressed
    .BufferWithCount(2)
    .Select(x => new {a = x[0], b = x[1]});

paired.Subscribe(Console.WriteLine);
person desco    schedule 27.01.2011
comment
Observable.Create требует возвращаемого значения (Action) - person Richard Szalay; 27.01.2011