2011-01-27 16 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 
私はすべての2つの文字を取って、新しい IObservable <CharPair>を作成するにはどうすればよい

など。

'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') –

関連する問題