在C#中分组事件
是否有任何可以使用的解决方案来分组活动?
说我有两个事件:A和B. 就像是: A可以发射不止一次,G只会在B发射后开火.相同的方式. 我正在寻找一个有这些活动的图书馆. 编辑:示例 Events: A | B | G 1 F 0 0 2 0 F F 3 0 F 0 4 0 F 0 5 0 F 0 6 F 0 F 7 F 0 0 8 0 F F 9 0 0 0 10 F F F F表示事件触发, 解决方法
你可以使用
Reactive Extensions.
查看Observable.FromEvent(或Observable.FromEventPattern)方法将标准.NET事件转换为observable,然后可以使用Observable.CombineLatest对结果进行分组. 这是一个伪代码: var observableA = Observable.FromEvent(yourEventA); var observableB = Observable.FromEvent(yourEventB); var observableG = observableA.CombineLatest(observableB,...) 触发两个事件时会触发生成的observable. 编辑 CombineLatest会生成具有最新结果的输出,而不会重置其状态.因此,例如,如果A1被点燃,则B1被点燃G1被产生(A1 B1),但是如果点燃B2则产生G2(A1 B2),依此类推…… 要准确地产生预期结果,您可以编写如下内容: private void SetupEvents() { var observableA = Observable.FromEventPattern((e) => btA.Click += e,(e) => btA.Click -= e); var observableB = Observable.FromEventPattern((e) => btB.Click += e,(e) => btB.Click -= e); EventPattern<object> lastA = null; EventPattern<object> lastB = null; var observableG = observableA.CombineLatest(observableB,(rA,rB) => { if (lastA == rA || lastB == rB) return null; lastA = rA; lastB = rB; return new Tuple<EventPattern<object>,EventPattern<object>>(rA,rB); }).Where(p => p != null); observableG.Subscribe(r => Trace.WriteLine("A + B")); // or use ToEvent to generate another standard .NET event //observableG.ToEvent().OnNext += GEvent; } //void GEvent(System.Reactive.EventPattern<object> obj) //{ // Trace.WriteLine("A + B"); //} 基本上我检查最新结果是否与当前结果不同.也许你的情况有一些原生RX扩展,但我找不到它. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |