我的wp7应用程序中要求我必须在搜索文本框上的每个按键上的列表集合(例如联系人列表)上进行部分匹配搜索(多个字段表示名字和姓氏)并绑定到列表框。我写了linq查询来获得texchanged事件的结果。我得到了预期的结果,但是如果我在集合中有超过500个项目,它就不会很快响应。
我已经发布了以下代码,如果有人可以帮我解决性能问题,我真的很感激。
private void TechChanged(object sender, TextChangedEventArgs e)
{
IList<Contacts> results = searchcontList
.Where(tb => tb.SearchText.Contains(textsearch.Text))
.ToList();
//"SearchText" is an attribute in contacts class which is concatination values of all the fields in contacts class
listcontact.ItemsSource = results;
}
答案 0 :(得分:3)
您很可能无法提高搜索性能(即查找匹配项目并将其呈现给UI所花费的时间) - 因此您需要查看更改应用程序的工作方式让它感觉更敏感。
您是否真的需要对输入TextBox
中的每个字符执行搜索?
您的问题的常见解决方案是一个名为“限制”的概念,您只在用户暂停文本条目一段时间后执行搜索。您可以使用Reactive Extensions轻松完成此操作,如下所示:
Observable.FromEvent<TextChangedEventArgs>(searchTextBox, "TextChanged")
.Select(e => ((TextBox)e.Sender).Text)
.Where(text => text.Length > 2)
.Throttle(TimeSpan.FromMilliseconds(400))
.Subscribe(txt => // do your search here!);
上面的代码确保在开始搜索之前有两个以上的字符,并且限制以确保每400毫秒只执行一次搜索。有关更多详细信息,请参阅我编写的codeproject文章:
Exploring Reactive Extensions (Rx) through Twitter and Bing Maps Mashups