2017-06-30 1 views
2

Sagen, ich habe die folgenden zwei beobachtbaren StrömeMapping abhängig beobachtbar Unter Liste

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

so IObservable<FolderView> auf einem LibraryView abhängt. Auch diese Ansichten sind flach, d. H. Sie haben keine Navigationseigenschaften.

Wie würde ich diese beiden Ströme zu einem IObservable<Library> Stream Karte, wo Library eine Liste von Folder s Unter der Annahme,

public class Library 
{ 
    public List<Folder> Folders { get; set; } 
} 

hat, dass ich leicht von einem LibraryView zu einem Library und von einem FolderView zu einem Folder abbilden .

Auch Mein Endziel ist es, einfach eine List<Library> mit z. B. ForEachAsync zu bekommen. Daher ist es unter Umständen nicht notwendig, eine IObservable<Library> zu erstellen.

Antwort

2

Ihr Problem Raum sieht wie folgt aus der Annahme:

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 { } 

Dann so etwas wie dies im Inneren funktioniert Do():

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(); 

Verwenden Select abzubilden, SelectManyawait Anrufe anzuwenden und await zu erhalten von IObservable<IList<T>> bis IList<T>.