c# сравнить строку независимо от языка - PullRequest
0 голосов
/ 26 февраля 2020

У меня есть подпрограмма, которая пытается найти указанный c термин в списке строк.

int FindString(string term, List<string> stringList)
{
    for (int i = 0; i < stringList.Count; i++)
    {
        if (stringList[i].Contains(term))
        {
            return i;
        }
    }

    return -1;
}

Термин всегда является строкой Unicode в английском языке sh - например, "B4" - в то время как список строк содержит строки, которые могут быть написаны на других языках. Например, строка может содержать «B4», но поскольку она была написана на греческом языке, метод Contains возвращает ложь при сравнении английской версии sh и греческой версии в основном одинаковых символов.

Есть ли способ преобразования не-Engli sh строка, поэтому метод Contains будет правильно возвращать true?

Пример термина и строки (имя файла в реальности):

term: B4

string: 19-299-12-Β4.txt

1 Ответ

3 голосов
/ 26 февраля 2020

Как правило, вам нужно «нормализовать» строку на основе ваших пользовательских правил, а затем выполнять поиск.

Поскольку не существует общепринятого отображения, включающего, по крайней мере, «Latin B», равное «Greek B», вы должны создайте свой собственный - базовый c словарь Dictionary<char,char> может быть достаточно.

В качестве части этой "нормализации" вы также можете рассмотреть отображение di git - для этого на самом деле доступна официальная информация Unicode - GetDigitValue .

Таким образом, общий код для нормализации будет выглядеть так:

var source = "А9"; // Cyrilic A9 - "\u0410\u0039"
var map = new Dictionary<char,char> { { 'А', 'A' } }; // Cyrillic to Latin 
var chars = source.Select( c =>
     CharUnicodeInfo.GetUnicodeCategory(c)==UnicodeCategory.DecimalDigitNumber?
           CharUnicodeInfo.GetDigitValue(c).ToString()[0] :
     map.ContainsKey(c) ? map[c] : 
     c);
var result = String.Join("", chars);

var term = "\u0041\u0039"; // Latin A9
Console.WriteLine(source.Contains(term));       
Console.WriteLine(result.Contains(term));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...