PaN*_*1Me 2 c# culture string-comparison
可能重复:
如何识别拼写不同的相似单词
在比较这三个字符串:“ voest”,“ vost”和“vöst”(德国文化)时,我试图使它返回true,因为它是同一个词。(实际上,只有oe和ö相同,但是例如对于DB归类CI来说是相同的,这是正确的,因为'vost'是错误键入的'voest')
无论我提供给该方法什么参数,string.Compare(..)/ string.Equals(..)始终返回false。
如何使string.Compare()/ Equals(..)返回true?
您可以创建一个忽略比较符号的自定义比较器:
class IgnoreUmlautComparer : IEqualityComparer<string>
{
Dictionary<char, char> umlautReplacer = new Dictionary<char, char>()
{
{'ä','a'}, {'Ä','A'},
{'ö','o'}, {'Ö','O'},
{'ü','u'}, {'Ü','U'},
};
Dictionary<string, string> pseudoUmlautReplacer = new Dictionary<string, string>()
{
{"ae","a"}, {"Ae","A"},
{"oe","o"}, {"Oe","O"},
{"ue","u"}, {"Ue","U"},
};
private IEnumerable<char> ignoreUmlaut(string s)
{
char value;
string replaced = new string(s.Select(c => umlautReplacer.TryGetValue(c, out value) ? value : c).ToArray());
foreach (var kv in pseudoUmlautReplacer)
replaced = replaced.Replace(kv.Key, kv.Value);
return replaced;
}
public bool Equals(string x, string y)
{
var xChars = ignoreUmlaut(x);
var yChars = ignoreUmlaut(y);
return xChars.SequenceEqual(yChars);
}
public int GetHashCode(string obj)
{
return ignoreUmlaut(obj).GetHashCode();
}
}
Run Code Online (Sandbox Code Playgroud)
现在,您可以将此比较器与Enumerable类似的方法一起使用Distinct:
string[] allStrings = new[]{"voest","vost","vöst"};
bool allEqual = allStrings.Distinct(new IgnoreUmlautComparer()).Count() == 1;
// --> true
Run Code Online (Sandbox Code Playgroud)