带有空处理的字符串相等

问题描述 投票:0回答:9

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

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

这首先处理 null 情况等。

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

(我有似曾相识的感觉,我以前可能问过这个问题,如果是的话我很抱歉)


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

c# .net string null equality
9个回答
59
投票

与 Java 不同,C# 字符串会覆盖

==
运算符:

if (str1 == str2)

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

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

23
投票

如果您不想想要将两个

null
字符串视为彼此相等,那么您的代码是最佳的。

另一方面,如果您希望将

null
值视为彼此相等,则可以使用

object.Equals(str1, str2)

更“对称”的方法也可以处理

null
值。

这并不是将

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


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
。当用作扩展方法时,它读起来相当好,但如果用作常规静态方法,则它也不能传达这一点。


3
投票

这样就可以了:

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

1
投票

您可以使用此代码

object.Equals(str1, str2)

1
投票

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

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

1
投票

在最新的 C# 版本中,我们现在还具有空合并选项。这不是一个精确的解决方案,但对于某些目的来说可能是一种更干净的解决方案。为了比较的目的,在 str1 实际上是 null 的情况下,需要一些自由来“升级”为空字符串。

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

0
投票

Necro 帖子,但给出答案,以防它帮助其他找到此帖子的人。

if (str1?.Equals(str2) ?? false)

如果

str1
不为空,则将执行针对
str2
的检查。如果
str1
为空,那么您将获得空合并运算符
??
的右侧,这将为您提供
false

© www.soinside.com 2019 - 2024. All rights reserved.