2014-06-23 16 views
0

我有一個ObservableCollection,其中Item有2個屬性(例如:Name和Id),collection包含12k個元素。所以,我有一個文本框,我想搜索元素,哪些名稱包含我的文本框的值,並將這些元素添加到新集合中。如何在ObservableCollection中實現並行搜索?

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

沒有必要擁有並行處理到位,通常,這種代碼應該幫助你在這裏。

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(); 
    } 
+0

謝謝,但它仍然緩慢渲染,10秒凍結。 –

+0

它工作良好時,即時輸入名稱的項目,這很少,但如果我使用像「疾病」(IM過濾詞彙表的診斷名稱) - 它的工作很難,因爲幾乎每個第三個元素包含該文本 –

+0

好吧,註釋掉DetectChildren方法內部的代碼,看看事情是否加速 - 過濾本身不應該有任何問題... –