C# 使用StringComparison或类似工具替代string.ToUpper(),完全保留行为
使用C# 使用StringComparison或类似工具替代string.ToUpper(),完全保留行为,c#,.net,string,compare,cultureinfo,C#,.net,String,Compare,Cultureinfo,使用left.ToUpper()==right.ToUpper()不是比较字符串的最佳选项,至少因为性能问题。我想重构(完全保留行为!)这段代码,使之高效,但无法实现特殊情况下的完全等效性 因此,这里有一个简单的测试方法: [TestCase("Strasse", "Straße", "tr-TR")] [TestCase("İ", "i", "tr-TR")] public void UsingToUpper_AndCurrentCultureIgnoreCase_AreSame(string
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,如以下答案中所定义:
但是,ToUpper方法在使用Unicode元数据之前不会有任何类似的行为。您不能强制字符串等于使用Unicode字符。查看您的测试用例,您希望第一个测试用例为true成功,第二个测试用例为true成功?因为ToUpper在第一种情况下失败,而stringComparison成功,所以您希望它们是真的吗?在第二种情况下,两者都是正确的。我希望有相同的行为。当前的任务是重构遗留代码,将包含字符串compare的
ToUpper()
重构为更高效的代码。多个使用者使用此代码,我们希望确保不会有任何内容被破坏。