c#比较字符串,不考虑语言

c#比较字符串,不考虑语言,c#,string,C#,String,我有一个例程,尝试在字符串列表中查找特定的术语 int FindString(string term, List<string> stringList) { for (int i = 0; i < stringList.Count; i++) { if (stringList[i].Contains(term)) { return i; } } return -1; }

我有一个例程,尝试在字符串列表中查找特定的术语

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

    return -1;
}
基本上,您需要根据自定义规则“规范化”字符串,然后执行搜索

由于没有公认的映射至少包含“拉丁B”等于“希腊B”,因此您必须构建自己的-基本字典
字典
可能就足够了

作为“标准化”的一部分,您也可以考虑数字映射——因为实际上有可用的Unicode官方信息。 因此,要规范化的总体代码如下所示:

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));
var source=“А9”//西里尔语A9-“\u0410\u0039”
var map=新字典{{'А',A'};//西里尔语到拉丁语
var chars=source.Select(c=>
CharUnicodeInfo.GetUnicodeCegory(c)=UnicodeCegory.DecimalDigitNumber?
CharUnicodeInfo.GetDigitValue(c).ToString()[0]:
图[c]:
c) );
var result=String.Join(“,chars);
var term=“\u0041\u0039”//拉丁语A9
Console.WriteLine(source.Contains(term));
Console.WriteLine(result.Contains(term));

请提供您所遇到问题的具体工作示例。字符串
“B4b”
在德语和英语中都是
“B4b”
,对这两个字符串进行相等检查总是会得到
true
。我认为您需要执行
字符串。将
字符串比较。传入的不变量文化
枚举比较。您好,请提供一些字符串示例,因为字符串不会根据输入语言而更改。如果您提供您正在查找的字符串和正在搜索的字符串,则会更容易提供帮助。第二个字符串中的
Β
是希腊字母Beta。这不是一个德语字母,甚至是一个不变的文化比较并不认为它们是同一个字母的变体。尽管它们的外观非常相似,但这就像期望
P
P
(或
P
Ρ
(Rho))被视为同一个字母一样。@Tsaras Ok,但它们“基本上不是相同的字符”(参见我编辑的评论)。我认为用英语搜索词搜索希腊文本听起来像是一件傻事。
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));