学习Rx:如何将可观察的字符序列解析为可观察的字符串序列?

Tim*_*ong 4 c# system.reactive

这可能非常简单,但我在Rx的学习曲线底部.我花了几个小时阅读文章,观看视频和编写代码,但我似乎对一些似乎应该非常简单的事情有一些心理障碍.

我正在从串口收集数据.我曾经习惯Observable.FromEventPattern捕获SerialDataReceived事件并将其转换为可观察的字符序列.到现在为止还挺好.

现在,我想基于分隔符来解析该字符序列.没有涉及新行,但每个"数据包"数据都由前导码和终结符包围,两个单个字符.为了争论,我们可以说它们是括号{}.

所以如果我j u n k { H e l l o } j u n k在我的字符序列上得到 字符序列,那么我想要发出Hello或者{Hello}在我的字符串序列上.

我可能错过了一些简单的东西,但我甚至无法弄清楚如何处理这个问题.有什么建议吗?

Tim*_*lds 6

这可以使用Publish和轻松完成Buffer:

var source = "junk{Hello}junk{World}junk".ToObservable();
var messages = source
    .Publish(o =>
    {
        return o.Buffer(
            o.Where(c => c == '{'),
            _ => o.Where(c => c == '}'));
    })
    .Select(buffer => new string(buffer.ToArray()));
messages.Subscribe(x => Console.WriteLine(x));
Console.ReadLine();
Run Code Online (Sandbox Code Playgroud)

这个输出是:

{Hello}
{World}
Run Code Online (Sandbox Code Playgroud)

这个想法是你可以在调用中使用以下打开和关闭选择器Buffer.使用Publishis是为了确保所有三个Buffer,开始选择器和结束选择器共享相同的订阅.

source:  junk{Hello}junk{World}junk|
opening: ----{----------{----------|
closing:     ------}|
closing:                ------}|
Run Code Online (Sandbox Code Playgroud)

  • 还有一个问题......`.Publish()`做什么?同样,我已阅读MSDN上的文档页面:"返回一个可观察序列,该序列是在可连接的可观察序列上调用选择器的结果,该序列共享对基础序列的单个订阅." 这对我来说是不透明的. (2认同)