什么是Rx.NET等同于flatMapIterable?

时间:2018-02-26 18:33:17

标签: c# system.reactive

  

今天我终于偶然发现了一个非常简单的RX问题的解决方案:假设你有一个Observable返回项目列表。喜欢Observable>。您经常会收到来自Web API的回复。

     

但是,您可能希望对单个项目进行操作,在本例中为字符串。

     flatMap可以拯救!这个方便的操作员通过映射功能将Iterables流扁平化为从这些Iterables的单个项生成的流。

https://medium.com/@ubuntudroid/rxjava-flattening-a-stream-of-iterables-ea26f593ba07

如果重要的话,我在dotnet核心写作

RxJava中的示例:Convert Observable<List<Car>> to a sequence of Observable<Car> in RxJava

2 个答案:

答案 0 :(得分:0)

在C#中执行此操作真的很简单。就这样做:

IObservable<IList<int>> source =
    Observable.Return(new [] { 1, 2, 3 }.ToList());

IObservable<int> output =
    from list in source
    from item in list
    select item;

简单。

答案 1 :(得分:-1)

编辑:我的错误,它也是SelectMany的重载方法:

public IObservable<string> IterateObservable(IList<string> strings)
{
    return strings
        .ToObservable()
        .Buffer(100) // IObservable<IList<string>>
        .SelectMany(item => item); // IObservable<string>
}

似乎在Rx.NET中没有与flatMapInterable相同的功能,因此您必须坚持使用SelectMany和ToObservable。再加上实际应用转换到每个项目。

示例(与stackoverflow链接中的RxJava示例相同):

public IObservable<string> IterateObservable(IList<string> strings)
{
    return strings
        .ToObservable()
        .Buffer(100)
        .SelectMany(list => list.ToObservable());
}

对它执行类似于flatMapIterable的操作(当然更详细):

public IObservable<string> IterateObservable(IList<string> strings)
{
    return strings
        .ToObservable()
        .Buffer(100)
        .SelectMany(
                list => list.ToObservable()
                    .Select( stringInList => stringInList.Trim()));
}