具有null处理的字符串相等

时间:2013-03-03 16:55:59

标签: c# .net string null equality

我会经常使用此代码来比较字符串:

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

首先处理空案例等。

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

(我有dejavu,我之前可能会问过这个问题,如果有的话,我道歉)


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

的情况下说“str1不等于str2”

8 个答案:

答案 0 :(得分:34)

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

if (str1 == str2)

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

if (String.Equals(str1, str2, StringComparison.OrdinalIgnoreCase)

答案 1 :(得分:15)

如果您希望将两个null字符串视为彼此相等,那么您的代码就是最优的。

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

object.Equals(str1, str2)

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

答案 2 :(得分:9)

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

String.Equals(str1, str2)

答案 3 :(得分:3)

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

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

然后像这样使用它:

str1.IsNotNullAndEquals(str2);

在IMO中命名将是你最难的事情......因为你需要传达你只是空检查str1。当用作扩展方法时,它读取得相当好,但如果用作常规静态,那么它也不会传达它。

答案 4 :(得分:2)

您可以使用此代码

object.Equals(str1, str2)

答案 5 :(得分: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
}

答案 6 :(得分:0)

这样做:

string.IsNullOrWhiteSpace(str1) ? string.IsNullOrWhiteSpace(str2) : str1.Equals(str2, StringComparison.OrdinalIgnoreCase);

答案 7 :(得分:0)

在最新的C#版本中,我们现在还具有null合并选项。这不是一个精确的解决方案,但可以出于某些目的而成为一种更清洁的解决方案。在比较中,实际上将str1升级为空字符串需要一些自由,以便它实际上是null。

if((str1?"").Equals(str2))
{
    //they are equal, do things here
}