【问题标题】:Reactive Extensions: Pairing values from an IObservable反应式扩展:配对来自 IObservable 的值
【发布时间】:2011-01-28 00:11:09
【问题描述】:

给定:

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

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

如何获取每两个字符并创建一个新的IObservable

例如

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

【问题讨论】:

    标签: c# system.reactive


    【解决方案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);
    

    【讨论】:

    • Observable.Create 需要返回值 (Action)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多