简而言之,CompareTo方法是与文化相关的。例如
ß(德语中的s sharp):
Console.WriteLine("ß Compare ss 1: " + ("ß".CompareTo("ss") == 0));
Console.WriteLine("ß Compare ss 2: " + (String.Compare("ß", "ss", StringComparison.Ordinal) == 0));
Console.WriteLine("ß equals ss: " + "ß".Equals("ss"));
Console.WriteLine("ß == ss: " + ("ß" == "ss"));
将打印出
ß Compare ss 1: True
ß Compare ss 2: False
ß equals ss: False
ß == ss: False
在您的情况下,您有相同但不同的字符串。通常我发现看到差异很有帮助,可以通过以下方式实现:
Console.WriteLine(
string.Join(", ",
ExecutionDay
.ToCharArray()
.Select(o =((int)o).ToString(CultureInfo.InvariantCulture))
.AsEnumerable()
)
);
导致字符编号列表:
8206, 84, 72, 85, 82, 83, 68, 65, 89
Unicode 中的字符 8206
是 从左到右标记
。
== 比较
这将仅比较值类型或基元类型的值。除此之外,它应该被用作引用比较。在 C# 中,字符串类型是特殊的,以下两个断言都将返回true:
string ss = getinput();
assertTrue("SS"=="SS");
assertTrue( ss =="SS");
在Java中,first会返回true,因为JIT运行时优化器从代码中收集所有唯一的字符串,并创建一个表格进行使用。第二个返回false,因为字符串只是不可变字符数组,如果由用户输入,则会使用新的内存空间,因此引用比较返回false。
C#实现Equals和相等运算符(==)的指南
Equals比较
与 == 不同,Equals方法只是在System.Object中定义的虚拟方法,并且由选择这样做的任何类进行了重写。 因此,将使用重写版本,并且对于字符串类型,这意味着将执行内容比较。
在重写Equals(Object)时,请遵循以下准则:
- 实现IComparable的类型必须重写Equals(Object)。
- 重写Equals(Object)的类型也必须重写GetHashCode;否则,哈希表可能无法正常工作。
- 您应该考虑实现IEquatable接口以支持强类型的相等测试。您的IEquatable.Equals实现应返回与Equals一致的结果。
- 如果您的编程语言支持运算符重载,并且您为给定类型重载了等号运算符,则还必须重写Equals(Object)方法以返回与等号运算符相同的结果。这有助于确保使用Equals(例如ArrayList和Hashtable)的类库代码的行为与应用程序使用等号运算符的方式一致。
C# 实现Equals方法
ComparedTo比较
注意
CompareTo 方法主要用于排序或字母顺序操作。当方法调用的主要目的是确定两个字符串是否相等时,不应使用该方法。要确定两个字符串是否相等,请调用 Equals 方法。
此方法使用当前区域设置执行单词(区分大小写和区域设置)比较。有关单词、字符串和序数排序的更多信息,请参阅 System.Globalization.CompareOptions。
来源:手册
string.Equals
。在检查相等之前,您可以对字符串进行清理。 - Yuval Itzchakov