我有两个observable,一个IObservable< AlertData>和另一个IObservable< SoundRequestData>. AlertData包含一个属性Id,它知道哪个SoundRequestData属于它. SoundRequestData只知道自己,并且有一个Id属性,可以匹配AlertData中的属性.
我想将这两种数据类型组合成一个新类型的AlertDataviewmodel.但是,我无法确定两个可观察数据中的数据顺序是否相同.我现在不关心输出中的顺序.
我想要的是将AlertData与SoundRequestData匹配.
我现在这样做的方式,虽然有效但很慢,但要等到其中一个observable完成后将所有数据提取到ObservableCollection中.然后我启动另一个observable并匹配Id的.
有没有更好的方法呢?我想这可以表达为以下大理石图:
所以a.id = 1匹配最多3.id = 1,b.id = 2匹配最多4.id = 2等等.
最佳答案
首先让我们为IObserver< T>引入一些扩展方法.
public static IObserver
这只是确保在模式OnNext *(OnError | OnCompleted)中调用观察者,并且只是忽略对它的违反.
我们现在可以通过按键缓冲来自两个序列的值来实现您所描述的运算符,并且只有在两个序列之间存在键匹配时才发出它们.
public static IObservable
例:
IObservableviewmodel> alertDataviewmodels = Join(
alertDatas,soundRequestDatas,alertData => alertData.Id,soundRequestData => soundRequestData.Id,(alertData,soundRequestData) => new AlertDataviewmodel
{
AlertData = alertData,SoundRequestData = soundRequestData
});