如何提高ObservableCollection中的过滤速度

时间:2011-12-12 15:08:04

标签: c# .net wpf windows filtering

我正在使用绑定到WPF DataGrid的ObservableCollection,该集合包含自定义类的实例(约500),自定义类是相对基本的(2个字符串,IP和自定义枚举)

我使用以下代码过滤网格(使用所有列),因为文本被输入到文本框中。

private void searchBox_TextChanged(object sender, TextChangedEventArgs e)
{
    CollectionViewSource SearchView = new CollectionViewSource();
    SearchView.Filter += Search_Filter;
    SearchView.Source = HostList;
    dataGridMain.ItemsSource = SearchView.View;
}

void Search_Filter(object sender, FilterEventArgs e)
{
    if (e.Item != null)
    {
        Host host = e.Item as Host;
        try
        {
            bool foundInHost = false;
            bool foundInIP = false;
            bool foundInUser = false;

            foundInHost = host.Hostname.ToLower().Contains(searchBox.Text.ToLower());
            foundInIP = host.IP.ToString().Contains(searchBox.Text.ToLower());
            foundInUser = host.Username.ToString().Contains(searchBox.Text.ToLower());

            if (foundInHost || foundInIP || foundInUser)
            {
                e.Accepted = true;
            }
            else
            {
                e.Accepted = false;
            }
        }
        catch (Exception ex)
        {

        }
    }
}

它可以工作,但即使在我闪亮的新款i7笔记本电脑上也需要太长时间。

有人建议更快速地过滤可观察的集合吗?

1 个答案:

答案 0 :(得分:2)

所有ToLower和包含的东西都没有帮助,但最直接的解决方案是

bool found = host.Hostname.ToLower().Contains(searchBox.Text.ToLower());             
if (!found)
{
  found = host.IP.ToString().Contains(searchBox.Text.ToLower());
  if (!found)
  {
    found = host.Username.ToString().Contains(searchBox.Text.ToLower()); 
  }
}

如果其中一个已经是真的,则不需要其他测试。

searchBox.CharacterCasing to Lower也会有所帮助。

并摆脱那个异常吞下(试试)。这是一个非常糟糕的习惯。 至少在应用程序中添加一个错误日志,记录异常,然后吞下。