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}在我的字符串序列上.
我可能错过了一些简单的东西,但我甚至无法弄清楚如何处理这个问题.有什么建议吗?
这可以使用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)