如何提高ObservableCollection中的过滤速度

本文关键字:过滤 速度 何提高 ObservableCollection | 更新日期: 2023-09-27 18:17:29

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

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

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笔记本电脑上也要花太长时间。

谁能建议一个更快的方法来过滤一个可观察集合?

如何提高ObservableCollection中的过滤速度

所有的ToLower和contains的东西都没有帮助,但最直接的修复将是

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。

并消除异常吞(try catch)。那真是个坏习惯。至少在应用程序中添加一个错误日志,记录异常,然后吞下。