[英]What's the Rx.NET equivalent to flatMapIterable?
今天我终于偶然发现了一个非常简单的 RX 问题的解决方案:假设你有一个 Observable,它返回项目列表。 像
Observable<List<String>>
。 您经常会从 Web API 收到类似这样的响应。
但是,您可能希望对单个项目进行操作,在本例中为字符串。
flatMapIterable
来救援! 这个方便的运算符通过映射函数将可Iterables
流扁平化为从这些可Iterables
的单个项目生成的流。
如果这很重要,我正在用 .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.