处理空值的字符串相等性

44

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

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

首先处理空值情况等。

有没有更简洁的方法进行字符串比较,可能使用单个方法调用来处理可能的null值?我只想知道,如果测试值为null,则这些字符串不相等。

(我感觉我之前可能问过这个问题,如果是这样,我很抱歉)


更新:在我的情况下,str2是一个已知的好字符串,无需检查其是否为null。 str1是“未知”的字符串,可能为空,因此我想说在str1 为空时,“str1不等于str2”...

1
你的代码有误;如果 str1 为空而 str2 不为空,它将返回 true。 - SLaks
@SLaks,实际上,我认为这就是他想要的。至少根据描述来看。 - Justin Pihony
我在这里有一个!所以只有当要比较的字符串不是null/空时才会继续。对吗? - Brady Moritz
显然,C# 6现在具有处理此类问题的功能。 - Brady Moritz
8个回答

54

与Java不同,C#字符串重写了==运算符:

if (str1 == str2)

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

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

我会留给OP决定,但我认为目标也是在任一侧为“null”时失败。 - Justin Pihony
1
@JustinPihony str1 == str2 && str1 != null 仍然更加优雅。 - p.s.w.g
@p.s.w.g 这样也可以,但这个答案并没有表达出来。另外,请看一下我的答案,我提供了一种封装的方式...正如所述,方法的命名可能是最困难的部分。 - Justin Pihony

22
如果您不希望将两个“null”字符串视为相等,则您的代码是最优的。
另一方面,如果您希望将“null”值视为相等,则可以使用。
object.Equals(str1, str2)

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

这不是对于将 null 字符串作为相等处理的对称字符串等式检查的唯一方法:你还可以使用 string.Equals(str1, str2) 或者甚至是 str1 == str2,它会重定向到 string.Equals


1
好的,这对我来说实际上是可行的,因为str2是一个已知的值而不是null。因此,null比较并不重要。 - Brady Moritz
我认为这不正确。尝试使用以下代码: `string s1 = null; string s2 = null;if (s1 == s2) { Console.WriteLine("Equal."); } else { Console.WriteLine("NOT equal."); }`它将打印“Equal.”(注意:这仅适用于字符串)。 - Grimm
我有这样的印象,你想通过你的回答表达的是仅有object.Equals(str1, str2)将null值视为相等,而"=="不会。 - Grimm
1
@Grimm 这很公平,我添加了一条注释以避免这种混淆。 - Sergey Kalinichenko
1
非常好。我重新阅读了开头的问题,确实他根本没有要求使用“==”。然而,在C#中与“==”或“!=”进行比较是如此普遍(与Java中不断使用“.Equals()”相反),以至于我在阅读答案时错过了它。因此,就内容而言,我真的错了,你是对的 - 但这样下一个读者就不会再犯同样的错误了。谢谢。 - Grimm
显示剩余4条评论

19
我知道这篇文章已经有几年了,我认为dasblinkenlight的解决方案完美地满足了你的需求。然而,出于可读性的原因,我更喜欢这段代码:
String.Equals(str1, str2)

6

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

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

然后像这样使用它:
str1.IsNotNullAndEquals(str2);

命名可能是最困难的部分,因为你需要表达你只是对str1进行了空检查。作为扩展方法时,它读起来相当顺畅,但如果作为常规静态方法使用,则无法传达这一点。

这就是我认为所需的。其实更好奇是否有内置的东西可以处理这个问题,但看起来似乎没有。谢谢! - Brady Moritz
实际上,如果str1是null,扩展方法是否适用于str1?我认为它会因为null异常而失败。 - Brady Moritz
@boomhauer 首先,我相信是这样的,但很快就会验证。其次,如果这有效,希望您能点赞并接受答案。 - Justin Pihony
@boomhauer 我没有测试过它,但有更多时间来记住这个。即使 str1 为空,这也可以工作。原因是因为这只是调用 StringExtensions.IsNotNullAndEquals(str1, str2) 的语法糖。它看起来像是在 str1 上调用的方法,但实际上不是。 - Justin Pihony

2
这就可以了:
string.IsNullOrWhiteSpace(str1) ? string.IsNullOrWhiteSpace(str2) : str1.Equals(str2, StringComparison.OrdinalIgnoreCase);

1

很好的答案,但实际上已经被提出了。 - Brady Moritz

1
你可以使用这段代码。
object.Equals(str1, str2)

1
在更近期的 C# 版本中,我们现在也有了空值合并选项。这不是一个完美的解决方案,但对于某些目的来说可能更加简洁。它会在实际上为 null 的情况下,将 str1 转换为空字符串以进行比较。
if((str1??"").Equals(str2))
{
    //they are equal, do things here
}

1
几乎 - 我怀疑是打错了。需要使用 '??' (合并) 而不是 '?'. 因此答案可能是 if ( ( str1??"" ).Equals( str2 ) ). { 它们相等 }. - MarkD
是的,你是对的。我把它和另一个用于在可能为空的对象上调用方法的新运算符混淆了。 - Brady Moritz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接