替代string.toupper()带有字符串比较或类似的替代行为



使用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方法提供文化,但这不是您的目标。您可以像以下答案中的定义一样编写自己的自定义文化:在ASP.NET中创建自定义文化

但是,与使用Unicode元数据之前提到的Toupper方法不会有任何类似的行为。您不能强迫字符串等于使用Unicode字符。

相关内容

  • 没有找到相关文章

最新更新