如何提高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笔记本电脑上也要花太长时间。
谁能建议一个更快的方法来过滤一个可观察集合?
所有的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)。那真是个坏习惯。至少在应用程序中添加一个错误日志,记录异常,然后吞下。