は、私は、次の2つの観察可能なストリームマッピング
IObservable<LibraryView> GetLibrariesSource();
IObservable<FolderView> GetLibraryFolderSource(LibraryView library);
を持っていると言うので、IObservable<FolderView>
はLibraryView
に依存します。また、これらのビューはフラットであり、すなわち、ナビゲーション特性を有しない。私はLibrary
は私が簡単にLibrary
へとFolderView
からFolder
にLibraryView
からマッピングすることができると仮定するとFolder
の
public class Library
{
public List<Folder> Folders { get; set; }
}
のリストを持っているIObservable<Library>
流れ、これら2つのストリームをマップする方法
。
また、私の最終目標は、たとえばForEachAsync
を使用してList<Library>
を取得することです。したがって、IObservable<Library>
を作成する必要はありません。取得するにはawait
呼び出し、およびawait
を適用するために、SelectMany
をマップするために
var libraryList = await librariesSource()
.Select(lv => (LibraryView: lv, FolderViewObservable: libraryFolderSource(lv)))
.SelectMany(async t => (LibraryView: t.LibraryView, FolderViews: await t.Item2.ToList()))
.Select(t =>
{
var newLibrary = libraryMapper(t.LibraryView);
newLibrary.Folders = t.FolderViews.Select(fv => folderMapper(fv)).ToList();
return newLibrary;
})
.ToList();
使用Select
:
async Task Do()
{
var libraryMapper = new Func<LibraryView, Library>(lv => /*implement me*/ new Library());
var folderMapper = new Func<FolderView, Folder>(fv => /*implement me*/ new Folder());
var librariesSource = new Func<IObservable<LibraryView>>(() => /*implement me*/ Observable.Empty<LibraryView>());
var libraryFolderSource = new Func<LibraryView, IObservable<FolderView>>(lv => /*implement me*/ Observable.Empty<FolderView>());
}
public class Library
{
public List<Folder> Folders { get; set; }
}
public class Folder { }
public class LibraryView { }
public class FolderView { }
次に、このような何かがDo()
内で動作します:あなたの問題空間を想定し