C# 具有空处理的字符串相等

C# 具有空处理的字符串相等,c#,.net,string,null,equality,C#,.net,String,Null,Equality,我将经常使用以下代码来比较字符串: if(!string.IsNullOrEmpty(str1) && str1.Equals(str2)){ //they are equal, do my thing } 这将首先处理空案例等 是否有一种更干净的方法来进行字符串比较,可能是使用一个方法调用来处理可能的空值?我只是想知道,如果测试值为null,字符串就不相等 (我有德哈武,我可能问过这个问题,如果是这样,我道歉) 更新:在我的例子中,str2是一个已知的比较好的字符串

我将经常使用以下代码来比较字符串:

if(!string.IsNullOrEmpty(str1) && str1.Equals(str2)){
    //they are equal, do my thing
}
这将首先处理空案例等

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

(我有德哈武,我可能问过这个问题,如果是这样,我道歉)


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

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

if (str1 == str2)
如果需要不区分大小写的比较:

if (String.Equals(str1, str2, StringComparison.OrdinalIgnoreCase)
如果您不想将两个
null
字符串视为彼此相等,那么您的代码是最佳的

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

object.Equals(str1, str2)
对于处理
null
值的更“对称”的方法,您可以使用此代码

object.Equals(str1, str2)

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

public static StringExtensions
{
    public static Boolean IsNotNullAndEquals(this string str1, string str2)
    {
        return !string.IsNullOrEmpty(str1) && str1.Equals(str2)
    }
}
然后像这样使用它:

str1.IsNotNullAndEquals(str2);

在这里,命名将是最困难的事情……因为您需要传达的是,您只需要检查空值
str1
。当用作扩展方法时,它的可读性相当好,但如果用作常规静态,那么它也无法传达这一点。

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

String.Equals(str1, str2)
这可以做到:

string.IsNullOrWhiteSpace(str1) ? string.IsNullOrWhiteSpace(str2) : str1.Equals(str2, StringComparison.OrdinalIgnoreCase);
在最近的C#版本中,我们现在也有空合并选项。这不是一个精确的解决方案,但出于某些目的,它可能是一个更干净的解决方案。为了便于比较,在str1实际为null的情况下,它可以自由地将其“升级”为空字符串

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

我知道这是一个很好的答案,虽然根据Microsoft文档()您可以使用以下方法来检查这两种情况:

if(string.Equals(str1,str2)){
    //they are equal with null handling
}

你的代码是错误的;如果
str1
为空,而
str2
不为空,则返回true。@SLaks实际上,我认为这是他想要的。至少在描述的基础上我有一个!因此,只有当要比较的字符串不是null/空时,它才会继续。对吗?显然c#6现在有了处理这个问题的功能。我将把它留给OP,但我相信,如果任何一方
null
@JustinPihony
str1==str2&&str1!=null仍然要优雅得多。@p.s.w.g,这很好,但这个答案并没有这么说。另外,请参阅我的答案,以获取封装此方法的方法…如前所述,方法的命名可能是最难的,这是我认为需要的。我真的更好奇,是否有什么内置的东西可以处理这个问题,但看起来像是一个“不”。谢谢实际上,如果str1是空的,扩展方法对str1有效吗?我想它会用空弹头爆炸exception@boomhauer首先,我相信是这样,但很快就会核实。第二,如果这样做有效的话,就需要投票和接受appreciated@boomhauer我没有测试它,但有更多的时间来记住这一点。即使
str1
为空,这也会起作用。原因是,这只是调用
StringExtensions.IsNotNullAndEquals(str1,str2)
的语法糖分,它看起来只是
str1
上的方法调用。好的,这实际上对我有效,因为str2是一个已知值,而不是null。因此,空比较并不重要。了解这一点很有用。但是,在我的特殊情况下,它没有帮助,因为第一个对象中的空值是null,而第二个值中的空值是空字符串。但是谢谢@带有C#字符串的CigarDoug没有“空值”这样的东西是“null”。不幸的是,它们通常看起来是一样的,造成了很多混乱。您可以通过使用
object.Equals(str1??”,str2??)
表达式来解决此问题。@dasblinkenlight在我的特殊情况下,我将比较SharePoint控件的当前值(如果为空,则为null)与SharePoint列表中字段的当前值(如果为空,则为空字符串,基于我获取值的方法)。在这个例子中,我需要检查null,然后检查相等性。但我会看看你的例子,看看它是否能完成同样的事情。谢谢几乎-我怀疑是打字错误。。需要“?”(合并)vs“?”。所以答案可能是如果((str1??).Equals(str2))。{他们是平等的}。