2017-06-30 8 views
2

は、私は、次の2つの観察可能なストリームマッピング

IObservable<LibraryView> GetLibrariesSource(); 
IObservable<FolderView> GetLibraryFolderSource(LibraryView library); 

を持っていると言うので、IObservable<FolderView>LibraryViewに依存します。また、これらのビューはフラットであり、すなわち、ナビゲーション特性を有しない。私はLibraryは私が簡単にLibraryへとFolderViewからFolderLibraryViewからマッピングすることができると仮定すると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()内で動作します:あなたの問題空間を想定し

答えて

2

は次のようになりますIObservable<IList<T>>からIList<T>までです。