如何提高ObservableCollection中的滤波器速度

我使用绑定到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笔记本电脑上使用时间太长。

任何人都可以建议一个更快的过滤可观察集合的方法吗?


那么所有的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降低也会有所帮助。

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

链接地址: http://www.djcxy.com/p/75233.html

上一篇: How To Improve Filter Speed in ObservableCollection

下一篇: Linq case insensitive join