在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。比较,这意味着它将使用依赖于区域性的比较。这可能意味着ß将比较等于德国的SS,或类似
stringValue.Equals(otherStringValue)
Null不被认为等于任何东西
除非你指定了StringComparison选项,否则它将使用看起来像直接序号相等性检查的东西,即ß与SS在任何语言或文化中都不相同
stringValue == otherStringValue
与stringValue.Equals()不同。
==运算符调用静态Equals(字符串a,字符串b)方法(该方法将转到内部的EqualsHelper进行比较。
在空字符串上调用. equals()会得到空引用异常,而on ==则不会。
对象。ReferenceEquals (stringValue otherStringValue)
只是检查引用是否相同,即它不只是两个具有相同内容的字符串,你是在比较字符串对象和它本身。
注意,对于上面使用方法调用的选项,有更多的重载选项来指定如何进行比较。
如果你只是想检查是否相等,我的建议是决定是否要使用文化相关的比较,然后根据选择使用. compareto或. equals。
如果你对BCL方法的差异感到好奇,Reflector是你的朋友:-)
我遵循以下准则:
精确匹配:编辑:我以前总是使用==操作符,原则是在Equals(string, string)中使用对象==操作符来比较对象引用,但似乎str .Equals(strB)总体上仍然比string快1-11%。= (strA, strB), strA == strB,和string。CompareOrdinal(箍,strB)。我用一个秒表对被拘禁/非被拘禁的字符串值进行循环测试,具有相同/不同的字符串长度,以及不同的大小(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
正如Ed所说,CompareTo用于排序。
然而,. equals和==之间是有区别的。
==本质上解析为以下代码:
if(object.ReferenceEquals(left, null) &&
object.ReferenceEquals(right, null))
return true;
if(object.ReferenceEquals(left, null))
return right.Equals(left);
return left.Equals(right);
原因很简单,下面的代码会抛出异常:
string a = null;
string b = "foo";
bool equal = a.Equals(b);
而下面这些则不会:
string a = null;
string b = "foo";
bool equal = a == b;