至少由于性能问题,使用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.CurrentCultureIgnoreCaseStringComparison.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/

10-11 18:33