我如何在ObservableCollection中实现并行搜索?

时间:2014-06-23 11:58:25

标签: c# silverlight search parallel-processing

我有一个ObservableCollection,其中Item有2个属性(例如:Name和Id),集合包含12k个元素。所以,我有一个文本框,我想搜索元素,其中包含我的文本框值,并在新集合中添加这些元素。

in real-proj: Silverlight,TreeView(它的ItemSource是我的收藏),动态变化。并且TreeView在UI中更改。

我的问题只是慢慢渲染搜索结果。我觉得如果它是平行的 - 它会拯救我。

例如,某些代码使用:

private ObservableCollection<ICDDocumentItemViewModel> LinearSearch(string searchText)
{
        var filteredCollection = new ObservableCollection<ICDDocumentItemViewModel>();
        if (searchText.Length > 3)
        {
            foreach (var itemViewModel in _linearCollection)
            {
                if (!itemViewModel.Model.Name.ToLower().Contains(searchText.ToLower())) continue;

                if (itemViewModel.Children.Count != 0)
                {
                    itemViewModel.IsExpanded = true;
                }

                filteredCollection.Add(itemViewModel);
            }
        }

    if(searchText.Length <= 3) 
    {
        return new ObservableCollection<ICDDocumentItemViewModel>(ICDItemsViewModelsMain);
    }
    return filteredCollection;
}

1 个答案:

答案 0 :(得分:1)

没有必要正常进行并行处理,此代码应该对您有所帮助。

    private ObservableCollection<ICDDocumentItemViewModel> GetFiltered(string filter)
    {
        ObservableCollection<ICDDocumentItemViewModel> filteredCollection;

        if (filter.Length > 3)
        {
            filteredCollection = new ObservableCollection<ICDDocumentItemViewModel>(_linearCollection.Where(x => x.Name.ToLower().Contains(filter)));

            filteredCollection.ToList().ForEach(DetectChildren);
        }
        else
        {
            filteredCollection = new ObservableCollection<ICDDocumentItemViewModel>();
        }

        return filteredCollection;
    }

    private void DetectChildren(ICDDocumentItemViewModel item)
    {
        item.IsExpanded = item.Children.Any();
    }