2015-08-27 2 views
1

Я использую AutoSuggestBox в универсальном приложении Windows на Win10. Я могу отфильтровать предложения просто отлично, но порядок испорчен. Например, в моем случае предложения - это названия городов. Когда я ввожу 't' в поле, я ожидаю увидеть сначала «Тегеран», а не «Афины», потому что он находится наверху списка, который содержит все города с «t».Как получить более точные результаты поиска с помощью AutoSuggestBox?

Я понимаю, что мне нужен список, отсортированный по

City.Name.IndexOf(sender.Text, StringComparison.OrdinalIgnoreCase) 

но то, что является самым простым и наиболее эффективным способом для достижения этой цели? Мой код следующим образом:

private void AutoSuggestBox_TextChanged(AutoSuggestBox sender, AutoSuggestBoxTextChangedEventArgs args) 
    { 
     // Only get results when it was a user typing 
     if (args.Reason == AutoSuggestionBoxTextChangeReason.UserInput) 
     { 
      List<string> myList = new List<string>(); 
      foreach (City myCity in Cities) 
      { 
       if (myCity.Name.IndexOf(sender.Text, StringComparison.OrdinalIgnoreCase) >= 0) 
       { 
        myList.Add(myCity.Name); 
       } 
      } 

      sender.ItemsSource = myList; 
     } 
    } 

ответ

0

Ты это

if (myCity.Name.StartsWith("t")) 
    myList.Add(myCity.Name); 
+0

Проблема заключается в том, что он не включает в себя все другие города, в которых есть «t», прямо под городами, начинающимися с «t», – Freakishly

0

В конце концов я изменил условие

if (myCity.Name.IndexOf(sender.Text, StringComparison.OrdinalIgnoreCase) == 0) 
0

Вы могли бы использовать StartsWith & Содержит функции.

if (myCity.Name.StartsWith("t")) 
myList.Add(myCity.Name); 
if (myCity.Name.Contains("t")) 
myList.Add(myCity.Name); 

Но они должны использоваться в отдельных петлях foreach. Первый один отфильтровывает все города, начиная с Т & следующий фильтрует все города, содержащие Т.

Если вы хотите использовать его один цикл Еогеасп вы можете сделать это:

if (myCity.Name.StartsWith("t")) 
myList1.Add(myCity.Name); 
if (myCity.Name.Contains("t") && myCity.Name.IndexOf(sender.Text, StringComparison.OrdinalIgnoreCase) != 0) 
myList2.Add(myCity.Name); 

Вы могли бы объединить оба списки & делают его как itesmSource.