繁体   English   中英

与 flatMapIterable 等效的 Rx.NET 是什么?

[英]What's the Rx.NET equivalent to flatMapIterable?

今天我终于偶然发现了一个非常简单的 RX 问题的解决方案:假设你有一个 Observable,它返回项目列表。 Observable<List<String>> 您经常会从 Web API 收到类似这样的响应。

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

flatMapIterable来救援! 这个方便的运算符通过映射函数将可Iterables流扁平化为从这些可Iterables的单个项目生成的流。

RxJava:扁平化迭代流 | 斯文·本德尔

如果这很重要,我正在用 .NET Core 编写。

RxJava 中的示例:在 RxJava 中将Observable<List<Car>>转换为Observable<Car>的序列

将项目集合映射到项目聚合集合的 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

在 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;

简单。

编辑:我的错误,它也是 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()));
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM