0

以下のコードは、Rx ライブラリに関して IObservable を返すように正しく記述されていますか? 正しく動作しているように見えますが、正しく使用しているのか疑問に思っています。

private IObservable<SearchResult[]> Search(string query)
{
    return Observable.Create((IObserver<SearchResult[]> observer)=>
        {
            List<SearchResult> result = new List<SearchResult>();
            foreach (TestsGroupMeta group in Engine.Groups)
            {
                string name = group.ToString();
                if (name.IndexOf(query, StringComparison.InvariantCultureIgnoreCase) != -1)
                {
                    result.Add(new SearchResult{ Name = name, Type = "Group"});
                }

                foreach (TestMethodMeta method in group.Methods)
                {
                    name = method.ToString();
                    if (name.IndexOf(query, StringComparison.InvariantCultureIgnoreCase) != -1)
                    {
                        result.Add(new SearchResult {Name = name, Type = "Method"});
                    }
                }
            }

            observer.OnNext(result.ToArray());
            observer.OnCompleted();

            return () => {};
        });
}

使い方はこんな感じ。

private void SearchForm_Load(object sender, EventArgs e)
{
    var textChanged = Observable.FromEventPattern<EventArgs>(txtQuery, "TextChanged")
        .Select(_ => ((TextBox)_.Sender).Text);

    var searchResult = from query in textChanged
        where query.Length >= 3
        from result in Search(query)
        select result;

    _resultsWatcher = searchResult
        .Throttle(TimeSpan.FromMilliseconds(200))
        .ObserveOn(lvResults)
        .Subscribe(resuts =>
            {
                lvResults.BeginUpdate();
                lvResults.Items.Clear();
                foreach (SearchResult result in resuts)
                {
                    ListViewItem item = new ListViewItem(result.Name);
                    item.SubItems.Add(result.Type);
                    lvResults.Items.Add(item);
                }

                lvResults.EndUpdate();
            });
}

また、そのようなメソッドから IObservable を作成する方法はありますか?

Task<List<SearchResult>> Search(string query){...}

または、大規模なデータセットに対して非同期検索を作成し、そこから IObservable を取得するための他のアプローチは何でしょうか。

どうも

4

1 に答える 1