【问题标题】:How To Improve Filter Speed in ObservableCollection如何提高 ObservableCollection 中的过滤速度
【发布时间】:2012-01-18 13:38:56
【问题描述】:

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

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

【问题讨论】:

    标签: c# .net wpf windows filtering


    【解决方案1】:

    好吧,所有 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 也会有所帮助。

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

    【讨论】:

    • 谢谢,简化检查并没有产生很大的不同 - 消除异常燕子产生了巨大的性能差异。
    • 好吧,我建议(强烈地咧嘴一笑)删除它,因为吞咽异常不好,但是将它们放在一个循环中,这实际上是你所拥有的,这该死的昂贵。通常的建议是测试(例如除数!= 0),而不是通过零异常或类似来捕获 div。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-21
    • 2010-12-02
    相关资源
    最近更新 更多