2011-01-27 79 views
3

配对值给出:反应扩展:从的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)); 

回答

2

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); 
+2

`Observable.Create`需要一个返回值(`Action`) – 2011-01-27 16:18:58