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

C# 如何在ObservableCollection中实现并行搜索?,c#,silverlight,search,parallel-processing,C#,Silverlight,Search,Parallel Processing,我有一个ObservableCollection,其中项有两个属性(例如:Name和Id),集合包含12k个元素。所以,我有一个文本框,我想搜索元素,其中的名称包含我的文本框值,并将这些元素添加到新集合中 在实际项目中: Silverlight、TreeView(其ItemSource是我的收藏)动态变化。和TreeView在UI中的变化 我的问题只是缓慢地呈现搜索结果。我想如果它是平行的,它会救我 例如,im使用的某些代码: private ObservableCollection<IC

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

在实际项目中: Silverlight、TreeView(其ItemSource是我的收藏)动态变化。和TreeView在UI中的变化

我的问题只是缓慢地呈现搜索结果。我想如果它是平行的,它会救我

例如,im使用的某些代码:

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;
}
private observeCollection LinearSearch(字符串搜索文本)
{
var filteredCollection=新的ObservableCollection();
如果(searchText.Length>3)
{
foreach(线性集合中的var itemViewModel)
{
如果(!itemViewModel.Model.Name.ToLower().Contains(searchText.ToLower()))继续;
如果(itemViewModel.Children.Count!=0)
{
itemViewModel.IsExpanded=true;
}
filteredCollection.Add(itemViewModel);
}
}

如果(searchText.Length正常情况下不需要进行并行处理,那么这段代码应该会对您有所帮助

    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();
    }
private observeCollection GetFiltered(字符串过滤器)
{
可观察收集过滤收集;
如果(filter.Length>3)
{
filteredCollection=新的ObservableCollection(_linearCollection.Where(x=>x.Name.ToLower().Contains(filter)));
filteredCollection.ToList().ForEach(DetectChildren);
}
其他的
{
filteredCollection=新的ObservableCollection();
}
返回筛选集合;
}
私有无效检测子项(ICDDocumentItemViewModel项)
{
item.IsExpanded=item.Children.Any();
}

谢谢,但渲染速度仍然很慢,10秒冻结。当我输入项目名称时效果很好,这很少见,但如果我使用“疾病”之类的词(im过滤诊断名称词汇表)-它很难工作,因为几乎每3个元素都包含该文本。好吧,注释DetectChildren方法中的代码,看看事情是否加快了速度-过滤本身不应该有任何问题。。。