什么是Rx.NET等同于flatMapIterable?

问题描述 投票:0回答:3

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

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

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

c# system.reactive
3个回答
4
投票

将项目集合映射到聚合项目集合的LINQ操作是SelectMany。此操作也存在于System.Reactive中,允许您从Observable集合中创建单个Observable:

http://www.introtorx.com/content/v1.0.10621.0/08_Transformation.html#SelectMany

Observable.Range(1,3)
          .SelectMany(i => Observable.Range(1, i))
          .Dump("SelectMany");

...我们现在得到一个输出,每个序列的结果([1],[1,2]和[1,2,3])被展平以产生[1,1,2,1,2,3] 。

SelectMany-->1
SelectMany-->1
SelectMany-->2
SelectMany-->1
SelectMany-->2
SelectMany-->3
SelectMany completed

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
投票

编辑:我的错误,它也是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()));
}
© www.soinside.com 2019 - 2024. All rights reserved.