使用left.ToUpper() == right.ToUpper()
不是比较字符串的最佳选择,至少是由于性能问题。我想重构(完全保留行为!(此代码,以提高某些效率,但无法达到特殊情况的完全等效性。
所以,这是一种简单的测试方法:
[TestCase("Strasse", "Straße", "tr-TR")]
[TestCase("İ", "i", "tr-TR")]
public void UsingToUpper_AndCurrentCultureIgnoreCase_AreSame(string left, string right, string culture)
{
// Arrange, Act
Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo(culture);
var toUpper = left.ToUpper() == right.ToUpper();
var stringComparison = left.Equals(right, StringComparison.CurrentCultureIgnoreCase);
// Assert
Assert.AreEqual(toUpper, stringComparison);
}
我尝试了两个选项, StringComparison.CurrentCultureIgnoreCase
和StringComparison.OrdinalIgnoreCase
它们两个都失败(在不同的情况下(。
所以,问题:
有没有一种方法可以比较两个字符串,而无需更改案例并完全保留toupper((的行为?
您恐怕要编写自己的自定义比较方法。
toupper正在利用Unicode元数据。每个角色 (Unicode代码点(具有案例以及案例映射到上和 小写(和标题案例(。.NET使用此信息转换 字符串到上下或小写。您可以找到相同的信息 在Unicode字符数据库中。
您可以为Toupper方法提供文化,但这不是您的目标。您可以像以下答案中的定义一样编写自己的自定义文化:在ASP.NET中创建自定义文化
但是,与使用Unicode元数据之前提到的Toupper方法不会有任何类似的行为。您不能强迫字符串等于使用Unicode字符。