至少由于性能问题,使用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方法提供区域性,但这不是您的目标。
您可以像在此答案中定义的那样编写自己的customCulture:Create custom culture in ASP.NET
但是,与ToUpper方法使用Unicode元数据之前没有任何类似的行为。您不能强制字符串等于使用Unicode字符。
关于c# - 具有StringComparison或类似内容的string.ToUpper()的替代品,可以完全保留行为,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56182322/