Текстовое поле, поиск без акцентов (игнорировать акценты)

В моем приложении Windows Phone есть ListBox (заполненный JSON) и TextBox, используемый для поиска элементов в ListBox.

Этот код работает отлично, но мне нужно иметь возможность искать "lapis" и находить "lápis". Поэтому мне нужно игнорировать акценты в моем поиске.

Как это сделать?

private void txtSearch_TextChanged(object sender, TextChangedEventArgs e)
 {
 if (Items != null)
 {
 this.List1.ItemsSource = Items.Where(w => w.descricao.ToUpper().Contains(SearchTextBox.Text.ToUpper()));
 }
 }

 private void WatermarkTB_GotFocus(object sender, RoutedEventArgs e)
 {
 if (SearchTextBox.Text == "Pesquisar Produto...")
 {
 SearchTextBox.Text = "";
 SolidColorBrush Brush1 = new SolidColorBrush();
 Brush1.Color = Colors.Red;
 SearchTextBox.Foreground = Brush1;
 }
 }
2 ответа

+ Изменить

w.descricao.ToUpper().Contains(SearchTextBox.Text.ToUpper())

к

CultureInfo.CurrentCulture.CompareInfo.IndexOf(
 w.descricao, 
 SearchTextBox.Text, 
 CompareOptions.IgnoreNonSpace | CompareOptions.IgnoreCase) != -1

Значение IgnoreNonSpace

Указывает на то, что сравнение строк должно игнорировать несогласование сочетания символов, таких как диакритические знаки.


Метод расширения:

public static string RemoveDiacritic(this string text)
{
 return text.Normalize(NormalizationForm.FormD).Where(chara => CharUnicodeInfo.GetUnicodeCategory(chara) != UnicodeCategory.NonSpacingMark).Aggregate<char, string="">(null, (current, character) => current + character);
}
</char,>

Применение:

this.List1.ItemsSource = Items.Where(w => w.descricao.ToUpper().RemoveDiacritic().Contains(SearchTextBox.Text.ToUpper().RemoveDiacritic()));

licensed under cc by-sa 3.0 with attribution.