Char,Culture和IgnoreCase平等

时间:2017-01-16 21:51:22

标签: c#

我试图比较两个忽略这个案例的字符,并想出了以下令人不安的代码,试图与现在着名的土耳其人玩:

char lowerCase = 'ı'; // U+0131 
char upperCase = 'I'; // regular upper i

// Displays True comparing the chars
Trace.WriteLine(char.ToUpper(lowerCase, CultureInfo.CurrentCulture) == char.ToUpper(upperCase, CultureInfo.CurrentCulture));

// Displays False comparing the strings
Trace.WriteLine(lowerCase.ToString().Equals(upperCase.ToString(), StringComparison.CurrentCultureIgnoreCase));

这两件事情正在使用我的文化(法语)并且似乎做同样的事情,但结果不是我所期望的(无论是True还是两者都是假的)。

使用土耳其文化时:

Thread.CurrentThread.CurrentCulture = new CultureInfo("tr-TR");

结果发生变化,两者都返回True。

我是否想念文化或字符/字符串比较?

修改

阅读this question,我现在明白两者是不同的。它与比较字符或字符串无关,而是处理自己的情况与否。我不明白的是他们与众不同的原因。不是string.Equals与CurrentCultureIgnoreCase应该像我一样比较字符串的大写版本吗?我无法看到的幕后背景是什么?

2 个答案:

答案 0 :(得分:0)

我猜测不区分大小写的比较可能适用于小写字母。

有了这个假设,第一次比较是'ı'.ToUpper* = 'I' vs 'I'.ToUpper = 'I' => true。 第二个比较是"ı".ToLower = "ı" vs "I".ToLower = "i" => false

要进行测试,如果测试大写比较与小写比较和不区分大小写的比较,只使用字符串和仅使用字符,则应该得到相同的惊人结果。您可以从'ı''I''i''İ'开始进一步分析。

*:这是至关重要的一点,我假设鉴于法语没有字母'ı',假设它的大写字母版本为'I',就像土耳其语一样。

答案 1 :(得分:0)

在Equals检查中没有明确的ToUpper或ToLower。

我的猜测是检查是否存在可以将一个更改为另一个的套管规则,反之亦然。

土耳其人和法国人都可以将“ı”大写成“I”。但只有土耳其人才能进行相反的转换,所以只有那些人物被认为是“等同于无视的情况”。