2012-05-03 3 views
1

У меня есть требование в моем приложении wp7, что я должен выполнить частичный поиск совпадений (несколько полей говорят имя и фамилия) в коллекции списка (например, список контактов) на каждое нажатие на текстовое поле поиска и привязать к списку. Я написал запрос linq, чтобы получить результат при событии texchanged. Я получаю результат, как ожидалось, однако это не так быстро, если у меня есть более 500 предметов в коллекции.WP7 Поиск в текстовом поле textchanged event

Я разместил код ниже, я очень признателен, если кто-то может помочь мне в настройке проблемы с производительностью.

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

Вы пробовали AutoCompleteBox из Silverlight Toolkit для Windows Phone: http://windowsphonegeek.com/articles/autocompletebox-for-wp7-in-depth –

+0

Да, но AutoCompleteBox для предложения не подходит для этого требования. Мне нужно связать результат с списком, который также содержит другие столбцы. Tobe более конкретный, скажем, у меня есть коллекция котактов [имя, фамилия, адрес электронной почты, номер телефона и т. Д.]. В этом случае мне может потребоваться выполнить поиск по anyfied, введя текст в текстовое поле поиска, чтобы запрос выполнял частичное совпадение и дал согласованный результат, который мне нужно связать со списком. Это я должен сделать в текстовом поле textearch. – user1371727

ответ

3

Вполне вероятно, что вы не будете в состоянии улучшить производительность поиска (то есть время, необходимое, чтобы найти элементы, совпадающие и визуализировать их в пользовательский интерфейс) - так что вы будете урожденная смотреть на изменение как ваше приложение работает, чтобы он чувствовал себя более отзывчивым.

Вам действительно нужно выполнить поиск по с пометкой, введенной в 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

+0

Спасибо за ваш быстрый ответ. Я попробую этот метод. – user1371727

+0

Наконец-то я начал работать с небольшим изменением. Пожалуйста, ознакомьтесь с приведенным ниже кодом и сообщите мне, можно ли выполнить импровизацию. Observable.FromEventPattern (textearch, «TextChanged») . Выберите (e => ((TextBox) e.Sender) .Text) . Где (текст => текст. Длина> 2) .Throttle (TimeSpan. FromMilliseconds (500)) . ObserveOnDispatcher() . Подписать (results => bindResult()); – user1371727

+0

Наконец-то я начал работать с небольшими изменениями. Пожалуйста, ознакомьтесь с приведенным ниже кодом и сообщите мне, можно ли выполнить импровизацию. спасибо Coline Observable.FromEventPattern (TextSearch, "TextChanged") .Select (е => ((TextBox) e.Sender) .Text) .гд (текст => text.Length> 2) . Дроссель (TimeSpan.FromMilliseconds (500)) . ObserveOnDispatcher() . Подписка (результаты => bindResult()); – user1371727