36

我会经常使用这段代码来比较一个字符串:

if(!string.IsNullOrEmpty(str1) && str1.Equals(str2)){
    //they are equal, do my thing
}

这首先处理空情况等。

是否有一种更简洁的方法来进行字符串比较,也许使用单个方法调用来处理可能的空值?我只是想知道如果测试值为空,则字符串不相等。

(我有dejavu,我之前可能已经问过这个问题,如果是这样,我很抱歉)


更新:在我的情况下, str2 是一个已知的好字符串进行比较,所以我不需要检查它是否为空。str1 是可能为空的“未知”字符串,所以在 str1为空的情况下,我想说“str1 不等于 str2” ...

4

8 回答 8

49

与 Java 不同,C# 字符串会覆盖==运算符:

if (str1 == str2)

如果您想要不区分大小写的比较:

if (string.Equals(str1, str2, StringComparison.OrdinalIgnoreCase))
于 2013-03-03T16:57:07.823 回答
19

如果您不想将两个null字符串视为彼此相等,那么您的代码是最佳的。

另一方面,如果您想将null值视为彼此相等,则可以使用

object.Equals(str1, str2)

对于也处理null值的更“对称”方法。

这不是对字符串相等性进行对称检查的唯一方法,它将null字符串视为相等:您还可以使用string.Equals(str1, str2)or 甚至str1 == str2,它重定向到string.Equals.

于 2013-03-03T16:57:17.307 回答
17

我知道这已经有几年的历史了,我认为 dasblinkenlight 的解决方案在功能上非常适合您的要求。但是出于可读性的原因,我确实更喜欢这段代码:

String.Equals(str1, str2)
于 2015-06-26T08:25:44.727 回答
6

没有内置的方法可以做到这一点,但您可以创建一个扩展方法来封装它。

public static StringExtensions
{
    public static Boolean IsNotNullAndEquals(this string str1, string str2)
    {
        return !string.IsNullOrEmpty(str1) && str1.Equals(str2)
    }
}

然后像这样使用它:

str1.IsNotNullAndEquals(str2);

命名将是您在这里 IMO 中最难的事情......因为您需要传达您只是空检查str1。当用作扩展方法时,它读起来相当不错,但如果用作常规静态,那么它也不能传达这一点。

于 2013-03-03T17:03:03.093 回答
1

您可以使用此代码

object.Equals(str1, str2)
于 2013-03-03T16:58:27.763 回答
1

我知道这是之前的答案,并且有很好的答案,尽管根据 Microsoft 文档(https://docs.microsoft.com/en-us/dotnet/api/system.string.equals?view=net-5.0)你可以使用以下方法检查这两种情况:

if(string.Equals(str1,str2)){
    //they are equal with null handling
}
于 2021-06-10T15:04:20.773 回答
1

这将做到:

string.IsNullOrWhiteSpace(str1) ? string.IsNullOrWhiteSpace(str2) : str1.Equals(str2, StringComparison.OrdinalIgnoreCase);
于 2018-05-16T18:57:47.627 回答
0

在最近的 C# 版本中,我们现在也有空合并选项。这不是一个精确的解决方案,但出于某些目的可能是一个更清洁的解决方案。出于比较目的,在它实际上为空的情况下,将 str1“升级”为空字符串需要一些自由。

if((str1??"").Equals(str2))
{
    //they are equal, do things here
}
于 2020-01-13T04:17:17.720 回答