当输入基本字符时,如何搜索带有变音符号的列表

本文关键字:搜索 音符 列表 符号 输入 字符 何搜索 | 更新日期: 2023-09-27 18:16:36

我正在为Windows Phone 8.1编写一个使用VS Express 2013和c#的小应用程序:

使用AutoSuggestBox工具,我希望用户的输入与字符串列表进行比较,但是列表中的字符串包含重音字符,如"*,*,*",我想向用户显示甚至包含"*"的结果,当他输入"c"。我该怎么做呢?

What I have:

var resultList = SuggestionsList.Where(s => s.Contains(suggestions.Text));
suggestions.ItemsSource = resultList;

其中"建议列表"是字符串的原始列表,"建议"是自动建议框的名称。

谢谢。

当输入基本字符时,如何搜索带有变音符号的列表

使用RegEx。所以,如果你的用户搜索"cat",你可以搜索类似"[cje]at"的东西。只有一些英文字母有重音变体,因此您可以创建这些字母的静态列表,并根据输入轻松构建RegEx。

另一种技术上更合理的方法在这篇文章中已经讨论过了。

RegEx例子

假设你的输入字符串是"cat",你想搜索字母"c"的所有变体。作为第一步,您将使用一个简单的循环构造RegEx:

string MyRegEx = "";
for(int i=0; i<input.Length; i++)
{
    switch(input[i])
    {
        case 'a':
            MyRegEx += [aâà];
            break;
        case 'c':
            MyRegEx += [cč];
            break;
        ....
        default: //for letters that do not have any accented variants
            MyRegEx += input[i];
            break;
    }
}
System.Text.RegularExpressions.RegEx R = new System.Text.RegularExpressions.RegEx(MyRegEx);
var Your Results = SuggestionsList.Where(s => R.IsMatch(s.ToLower()));

您需要与无字符版本的字符串进行比较,您可以通过使用Unicode字符串库(在c#中可用)中称为规范化(string . normalize)的特性来实现这一点。FormD规范化将一个复合字符分成"基字符"和特征字符。

您可以使用以下代码片段使用规范化从字符中剥离一个变音符号:

string formDString = txt.Normalize(NormalizationForm.FormD);
var sb = new StringBuilder();
var len = formDString.Length;
for (int i = 0; i < len; i++)
{
    var formDChar = formDString[i];
    System.Globalization.UnicodeCategory category = System.Globalization.CharUnicodeInfo.GetUnicodeCategory(formDChar);
    if (category != System.Globalization.UnicodeCategory.NonSpacingMark)
    {
        sb.Append(formDChar);
    }
}