2012-07-18 79 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作为值的单值序列)。

相关问题