我想对可观察对象应用转换,但是我希望某些记录在输出中产生附加记录。这是我的意思的程序版本:

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

10-06 06:56
查看更多