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?