C# 根据可观察序列中的事件顺序执行操作
我有三个(或更多)可观察的C# 根据可观察序列中的事件顺序执行操作,c#,.net,system.reactive,C#,.net,System.reactive,我有三个(或更多)可观察的bool序列: IObservable<bool> a0 = ...; IObservable<bool> a1 = ...; IObservable<bool> a2 = ...; 但是如果true值以另一种顺序出现,我想做一些其他事情: (a2, a1, a0) => ...do something else... (a0, a1, a2) => ...do something entirely else... 所
bool序列:
IObservable<bool> a0 = ...;
IObservable<bool> a1 = ...;
IObservable<bool> a2 = ...;
但是如果true
值以另一种顺序出现,我想做一些其他事情:
(a2, a1, a0) => ...do something else...
(a0, a1, a2) => ...do something entirely else...
所以我只对每个序列的第一个true
值感兴趣,根据它们出现的顺序,我想执行一些操作
我可以记录true
的每次首次出现的时间戳,然后在combinelateest
调用中排序,但我感觉有更好的方法。这种方法的一个问题是,我现在依赖于记录的时间戳的粒度。首先,您只需要真实值,所以忽略其余值。其次,您可以将每个可观察到的内容编码为更具语义的含义(可能是字符串?)。第三,您可以合并这些流,等待3个值到达,然后根据它们采取行动
设立:
var a0 = new Subject<bool>();
var a1 = new Subject<bool>();
var a2 = new Subject<bool>();
合并并获取三个值:
var merged = a0t.Merge(a1t).Merge(a2t);
var message = merged.Buffer(3).Subscribe(x => ProcessMessage(String.Join("", x)));
处理科:
public void ProcessMessage(string message)
{
switch(message) {
case "a0a1a2": Console.WriteLine("1"); break;
case "a1a2a0": Console.WriteLine("2"); break;
case "a2a1a0": Console.WriteLine("3"); break;
}
}
和测试:
a1.OnNext(true);
a2.OnNext(true);
a0.OnNext(true);
首先,您只需要真正的值,所以忽略其余值。其次,您可以将每个可观察到的内容编码为更具语义的含义(可能是字符串?)。第三,您可以合并这些流,等待3个值到达,然后根据它们采取行动
设立:
var a0 = new Subject<bool>();
var a1 = new Subject<bool>();
var a2 = new Subject<bool>();
合并并获取三个值:
var merged = a0t.Merge(a1t).Merge(a2t);
var message = merged.Buffer(3).Subscribe(x => ProcessMessage(String.Join("", x)));
处理科:
public void ProcessMessage(string message)
{
switch(message) {
case "a0a1a2": Console.WriteLine("1"); break;
case "a1a2a0": Console.WriteLine("2"); break;
case "a2a1a0": Console.WriteLine("3"); break;
}
}
和测试:
a1.OnNext(true);
a2.OnNext(true);
a0.OnNext(true);
他们能在任何其他可观察到的触发真之前再次触发一个true
?这是一场“滚动”比赛,还是在三者匹配后重新开始?我只对第一个true
值感兴趣。在那之后,我处理了观察者。我给出了一个基于这个和其他一些天真假设的答案。然而,整个方法应该转化为许多场景。在任何其他可观察到的触发一个true之前,他们能否再次触发一个true
?这是一场“滚动”比赛,还是在三者匹配后重新开始?我只对第一个true
值感兴趣。在那之后,我处理了观察者。我给出了一个基于这个和其他一些天真假设的答案。但是,整个方法应该转化为许多场景。很好:)我完全可以将其转化为我的具体情况。如果在a0t、a1t和a2t的定义中添加Take(1),它将在第一个真值之后处理它们。能够动态管理消息操作可能很有用,因此,我可以建议您避免使用ProcessMessage
方法,并创建您订阅的单独的Where
子句Observables吗?很好:)我完全可以将此转换为我的具体情况。如果您在a0t的定义中添加Take(1),a1t和a2t它将在第一个真值之后处理它们。能够动态管理消息操作可能很有用,因此我建议您避免使用ProcessMessage
方法,并创建您订阅的单独的Where
子句observes?