C# 如何在ObservableCollection中实现并行搜索?
我有一个ObservableCollection,其中项有两个属性(例如:Name和Id),集合包含12k个元素。所以,我有一个文本框,我想搜索元素,其中的名称包含我的文本框值,并将这些元素添加到新集合中 在实际项目中: Silverlight、TreeView(其ItemSource是我的收藏)动态变化。和TreeView在UI中的变化 我的问题只是缓慢地呈现搜索结果。我想如果它是平行的,它会救我 例如,im使用的某些代码: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
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方法中的代码,看看事情是否加快了速度-过滤本身不应该有任何问题。。。