在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。

其他回答

下面是这些函数的工作规则:

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。

从MSDN:

CompareTo方法主要用于排序或 排序操作。它不应该用于初级 该方法调用的目的是确定两个字符串是否正确 等价的。要确定两个字符串是否等效,请调用 Equals方法。”

他们建议在仅寻找相等时使用. equals而不是. compareto。我不确定字符串类的. equals和==之间是否有区别。我有时会使用。equals或Object。在我自己的类中使用ReferenceEquals而不是==,以防稍后有人出现并为该类重新定义==操作符。

s2 . compareto (s2):如果主要目的是确定两个字符串是否等效,则不要使用 s1 == s2:不能忽略大小写 s1。Equals(s2, StringComparison):如果s1为空,抛出NullReferenceException 字符串。Equals(s2, StringComparison):通过消除过程,这个静态方法是WINNER(假设一个典型的用例来确定两个字符串是否等效)!

在你列出的表格中,两者之间没有太大的区别。CompareTo最终调用CompareInfo方法,该方法使用当前区域性进行比较;Equals由==运算符调用。

如果考虑到过载,情况就不一样了。Compare和==只能使用当前区域性来比较字符串。等号和字符串。Compare可以接受一个StringComparison枚举参数,允许您指定区域性不敏感或大小写不敏感的比较。只有字符串。Compare允许您指定CultureInfo并使用默认区域性以外的区域性执行比较。

由于它的多功能性,我发现我使用了String。比任何其他比较方法都要比较;它可以让我精确地指定我想要的东西。

使用. equals,你还可以获得StringComparison选项。对于忽略大小写和其他东西非常方便。

顺便说一句,这将计算为假

string a = "myString";
string b = "myString";

return a==b

因为==比较a和b(它们是指针)的值,只有当指针指向内存中的同一个对象时,这个函数才会求值为true。. equals解引用指针并比较指针上存储的值。 a = (b)在这里为真。

如果把b改成:

b = "MYSTRING";

那么a = (b)是假的,但是

a.Equals(b, StringComparison.OrdinalIgnoreCase) 

是正确的

a.CompareTo(b) calls the string's CompareTo function which compares the values at the pointers and returns <0 if the value stored at a is less than the value stored at b, returns 0 if a.Equals(b) is true, and >0 otherwise. However, this is case sensitive, I think there are possibly options for CompareTo to ignore case and such, but don't have time to look now. As others have already stated, this would be done for sorting. Comparing for equality in this manner would result in unecessary overhead.

我确定我遗漏了一些东西,但我认为如果你需要更多细节,这些信息应该足够开始试验了。