反应式扩展:将 IObservable 中的值配对

发布于 2024-10-14 07:29:12 字数 780 浏览 3 评论 0原文

给定:

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

Given:

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

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

How can I take every two characters and create a new IObservable<CharPair>?

E.g.

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

So far I have the following but this seems rather long winded, can it be improved on?

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

海未深 2024-10-21 07:29:12

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

BufferWithCount should help, you can do something like this:

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);
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文