2

System.IObservable<string>に変換するにはどうすればよい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ます。どうすればこれを達成できますか?

4

2 に答える 2

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)、列挙可能なものを返すことです。オブザーバブルを返すようにコーディングする必要があります。

于 2012-07-18T08:07:55.070 に答える
1

うーん、ここでは Observable.Start があなたの友達だと思います。Observable Sequences を強制しているように見えるコードがたくさんありますが、実際にはそのようには見えません。

Rx は一連のプッシュ データを処理するように設計されていることを思い出してください。たまたまリストである 1 のシーケンスがあるようです。ここでは TPL/Task/async が適しています。

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 を値として持つ単一の値のシーケンスです)。

于 2012-07-25T11:28:09.503 に答える