2012-07-18 78 views
2

如何將System.IObservable<string>轉換爲System.IObservable<System.Collections.Generic.List<string>>System.IObservable <string> to System.IObservable <System.Collections.Generic.List <string>>

public static IObservable<List<string>> GetUrlList(Uri url) { 
    var result = (from request in Observable.Return(GetWebRequest(url, false)) 
    from response in Observable.FromAsyncPattern<WebResponse>(
    request.BeginGetResponse, request.EndGetResponse)() 
     from item in GetUrlCollection(response).ToObservable() 
    select item); 
    return result; 
} 

這裏的項目類型是「字符串列表」。我需要將其轉換爲IObservable List of strings。我怎樣才能做到這一點?

回答

2

試試這個:

public static IObservable<List<string>> GetUrlList(Uri url) 
{ 
    var result = (
     from request in Observable.Return(
      GetWebRequest(url, false)) 
     from response in Observable.FromAsyncPattern<WebResponse>(
      request.BeginGetResponse, request.EndGetResponse)() 
     from item in GetUrlCollection(response) 
      .ToObservable() 
      .ToArray() 
     select item 
      .ToList()); 
    return result; 
} 

我這整個的做法唯一擔心的是,你的GetUrlCollection(response)是返回一個枚舉。你真的應該編碼這個返回一個可觀察的。

1

嗯,我認爲Observable.Start是你的朋友在這裏。你有一堆代碼,它看起來像你強迫進入Observable Sequences,當它們看起來不像它們時。記得Rx被設計用於處理推送數據的序列。你似乎有一個1的序列,恰好是一個List。 TPL /任務/異步在這裏很適合。

如果你確實想使用Rx,我建議避免在IEnumable和IObservable之間纏繞。這樣做是創建惡劣競爭條件和混淆下一個開發人員的快速方法。

public static IObservable<List<string>> GetUrlList(Uri url) 
{ 
    return Observable.Start(()=> 
    { 
    var request = GetWebRequest(url, false); 
    return GetUrlCollection(request);//Code change here?? 
    }); 
} 

在這裏,您可以愉快地在您的Observable.Start委託中同步。對於下一個人來說,這應該更容易理解(即,這是一個UrlCollection作爲值的單值序列)。

相關問題