今天我终于偶然发现了一个非常简单的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
将项目集合映射到聚合项目集合的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()));
}