当前位置: 首页 > 编程语言 > C#

Rx如何对一个复杂的对象进行key分组,然后在不“停”流的情况下执行SelectMany?Share

时间:2023-04-10 21:35:08 C#

Rx如何按键对复杂对象进行分组,然后在不“停止”流程的情况下执行SelectMany?这与我的另一个问题有关。JamesWorld提出了以下解决方案://idStream是ID输入流的IObservable//alarmInterval是一个Func,它在给定ID的情况下获取间隔varidAlarmStream=idStream.GroupByUntil(key=>key,grp=>grp.Throttle(alarmInterval(grp.Key))).SelectMany(grp=>grp.IgnoreElements().Concat(Observable.Return(grp.Key)));<编辑2:问题:如何在不等待第一个事件到达的情况下立即启动计时器?我猜这是我问题的根本问题。为此,我计划发送具有我知道应该存在的ID的虚拟对象。但是正如我在下面所写的那样,我最终遇到了一些其他问题。尽管如此,我认为解决这个问题也会很有趣。然后转发其他有趣的部分!现在,如果我想按如下方式对一个复杂对象进行分组,并按键分组,就像这样(不会编译)varidAlarmStream=idStream.Select(i=>new{Id=i,IsTest=true}).GroupByUntil(key=>key.Id,grp=>grp.Throttle(alarmInterval(grp.Key))).SelectMany(grp=>grp.IgnoreElements().Concat(Observable.Return(grp.Key)));然后我遇到了麻烦。我无法修改有关SelectMany、Concat和Observable.Return的部分,以便查询像以前一样工作。例如,如果我将查询设置为varidAlarmStream=idStream.Select(i=>new{Id=i,IsTest=true}).GroupByUntil(key=>key.Id,grp=>grp.Throttle(alarmInterval(grp.Key))).SelectMany(grp=>grp.IgnoreElements().Concat(Observable.Return(grp.Key.First()))).Subscribe(i=>Console.WriteLine(i.Id+"-"+i.IsTest);然后需要两个事件来观察订阅的输出。这是第一次调用的效果,我收集到。另外,我想在对alarmInterval的调用中使用复杂的对象属性。有人能解释一下发生了什么上,它甚至是一个解决方案吗?使用未修改的解决方案的问题是分组不单独查看ID值来获取键值,它还会查看IsTest字段。<编辑:作为注释,问题可能是通过创建一个明确的类或结构,然后实现一个自定义的IEquatable,然后使用James的代码来解决问题,以便仅通过ID进行分组。不过感觉就像一个hack。另外,如果你想计算看到某个警报响起之前的项目次数,您可以这样做,在选择中使用计数器超载。varidAlarmStream=idStream.Select(i=>new{Id=i,IsTest=true}).GroupByUntil(key=>key.Id,grp=>grp.Throttle(alarmInterval(grp.Key)).SelectMany(grp=>grp.Select((count,alarm)=>new{count,alarm}).TakeLast(1));请注意,对于第一个(种子)项目,它将是0-这可能是你想要的。你是在Select中创建一个匿名类型。我们称它为A1。我假设您的idStream是一个IObservable。由于这是GroupByUntil的键,您无需担心键比较-int相等性很好。GroupByUntil是一个IObservable>。编写的SelectMany试图成为一个IObservable。您在这里只需要Concat(Observable.Return(grp.Key))-但Key的类型和Group元素的类型必须匹配,否则SelectMany将无法工作。所以密钥也必须是A1。匿名类型使用结构相等,返回类型将是A1的流-但您不能将其声明为公共返回类型。如果你只想要Id,你应该在Throttle之后添加一个.Select(x=>x.Id):varidAlarmStream=idStream.Select(i=>new{Id=i,IsTest=true}).GroupByUntil(key=>key.Id,grp=>grp.Throttle(alarmInterval(grp.Key).Select(x=>x.Id)).SelectMany(grp=>grp.IgnoreElements().Concat(Observable.Return(grp.Key))));如果你想要A1-你需要创建一个实现平等的具体类型。编辑我还没有测试过,但你也可以更简单地展平它,我认为它更容易!它正在输出A1,所以如果你需要在某处返回流,你将不得不处理它。以上就是C#学习教程:Rx如何对一个复杂的对象进行key分组,然后在不“停”流的情况下执行SelectMany?如果分享的内容对你有用,需要了解更多C#学习教程,希望你多多关注——varidAlarmStream=idStream.Select(i=>new{id=i,IsTest=true}).GroupByUntil(key=>key.Id,grp=>grp.Throttle(alarmInterval(grp.Key)).SelectMany(grp=>grp.TakeLast(1));本文收集自网络,不代表一个职位。如涉及侵权,请点击右侧联系管理员删除。如需转载,请注明出处: