我想对可观察对象应用转换,但是我希望某些记录在输出中产生附加记录。这是我的意思的程序版本:
foreach (var source in sourceList)
{
var destObject = new DestObject(source);
output.Add(destObject);
if (source.Type == 7)
{
var additionalObject = new DestObject {
Field1 = xx,
Field2 = yy,
};
output.Add(additionalObject);
}
}
有没有一种好的功能性“反应性”方法来做到这一点?我能想到的最好的方法是使用SelectMany,然后基本上使用上面的示例函数创建1个或2个成员列表,然后在lambda中返回该列表。看起来还可以,但是对于响应式扩展和函数式编程我还是很陌生,我只是不知道自己是否缺少一种更优雅的方法。
最佳答案
这是一个根据输入生成1个或2个元素作为IEnumerable<int>
的变换。您可以返回列表,但使用yield方便。
IEnumerable<int> Transform(int data){
if(data == 0){
yield 1;
}
if(data == 1){
yield 3;
yield 4;
}
}
从某处获取资源
IObservable<int> source = ...;
使用SelectMany转换您的源数据
IObservable<int> sink = source.SelectMany(Transform);
将数据转储到控制台
sink.Subscribe(Console.WriteLine);
如果来源提供了数据
0 0 1 1 0
然后下沉会得到
1 1 3 4 3 4 1