如何提高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