今天我终于偶然发现了一个非常简单的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
答案 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()));
}