C#中字符串比较方法的差异
在C#中比较字符串非常简单。 实际上有几种方法可以做到这一点。 我在下面的部分列出了一些。 我很好奇的是它们之间的区别,以及什么时候应该用于其他方面? 应该不惜一切代价避免? 我还没有列出更多吗?
string testString = "Test";
string anotherString = "Another";
if (testString.CompareTo(anotherString) == 0) {}
if (testString.Equals(anotherString)) {}
if (testString == anotherString) {}
(注意:我在这个例子中寻找的是平等,不低于或大于,但也可以随意评论)
以下是这些功能如何工作的规则:
stringValue.CompareTo(otherStringValue)
null
在字符串之前出现 CultureInfo.CurrentCulture.CompareInfo.Compare
,这意味着它将使用与文化相关的比较。 这可能意味着ß
将与德国的SS
相当或类似 stringValue.Equals(otherStringValue)
null
不被视为等于任何东西 StringComparison
选项,否则它将使用看起来像是任何语言或文化中的直接序数相等检查,即ß
与SS
不同 stringValue == otherStringValue
stringValue.Equals()
不一样。 ==
运算符调用静态Equals(string a, string b)
方法(然后转到内部EqualsHelper
进行比较。 null
字符串调用.Equals()
会得到null
引用异常,而on ==
不会。 Object.ReferenceEquals(stringValue, otherStringValue)
只需检查引用是否相同,即它不仅仅是两个具有相同内容的字符串,而是将字符串对象与它自己进行比较。
请注意,使用上述使用方法调用的选项,会有重载和更多选项来指定如何比较。
我的建议是,如果你只是想检查平等,就决定是否要使用依赖于文化的比较,然后根据选择使用.CompareTo
或.Equals
。
来自MSDN:
“CompareTo方法主要用于排序或字母排序操作,当方法调用的主要目的是确定两个字符串是否相等时,不应使用CompareTo方法。要确定两个字符串是否相等,请调用Equals方法。 “
他们建议在仅考虑平等时使用.Equals
而不是.CompareTo
。 我不确定string
类的.Equals
和==
之间是否有区别。 我有时会使用.Equals
或Object.ReferenceEquals
代替==
我自己的类,以防有人在以后的时间出现了,重新定义了==
操作符为类。
如果你对BCL方法的差异感到好奇,Reflector就是你的朋友:-)
我遵循这些准则:
完全匹配:编辑:我以前总是使用==运算符的原则,内部等于(字符串,字符串)对象==运算符用于比较对象引用,但它似乎strA.Equals(strB)仍然是1-11%整体比string.Equals(strA,strB),strA == strB和string.CompareOrdinal(strA,strB)更快。 我使用StopWatch对两个实际/非实例字符串值进行循环测试,具有相同/不同字符串长度以及不同大小(1B到5MB)。
strA.Equals(strB)
人类可读的匹配(西方文化,不区分大小写):
string.Compare(strA, strB, StringComparison.OrdinalIgnoreCase) == 0
人类可读的匹配(由CultureInfo定义的所有其他文化,不敏感案例/重音/假名/等):
string.Compare(strA, strB, myCultureInfo) == 0
用户可读的自定义规则匹配(所有其他文化):
CompareOptions compareOptions = CompareOptions.IgnoreCase
| CompareOptions.IgnoreWidth
| CompareOptions.IgnoreNonSpace;
string.Compare(strA, strB, CultureInfo.CurrentCulture, compareOptions) == 0
链接地址: http://www.djcxy.com/p/58629.html