在 Null 值字符串上使用 String.Contains

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

在我的应用程序中,我从 Active Directory 获取描述,然后将其分配给一个字符串,以便稍后检查该字符串是否为“Contracted”,以便忽略该用户。
问题是并非所有用户都在描述字段中具有值,这会导致抛出

Null Reference Exception
。我能想到处理这个问题的唯一方法是使用
String.IsNullOrEmpty
添加另一个检查并添加一个临时值,然后删除该临时值。这看起来很麻烦而且错误。

在检查过程中,我需要做什么来处理字符串中的

null
?我尝试了以下两组代码,都抛出错误:

var userDescription = (string)userDirectoryData.Properties["description"].Value;

if (userDescription.Contains("Contracted"))
{
    continue;
}
else
{
    //Do Stuff here
}

还有

var userDescription = (string)userDirectoryData.Properties["description"].Value;

if (userDescription.IndexOf("Contracted") > -1)
{
    continue;
}
else
{
    //Do Stuff here
}

编辑: 根据https://msdn.microsoft.com/en-us/library/k8b1470s.aspx我无法设置为String.Empty,因为这将返回“0”的结果,导致误报,描述仅包含“契约”。

c# string contains
4个回答
4
投票

如果值为 null,则使用 c# 可空合并:

分配一个空字符串
var userDescription = (string)userDirectoryData.Properties["description"].Value ?? String.Empty;

if (userDescription.Contains("Contracted"))
{
    continue;
}
else
{
    //Do Stuff here
}

4
投票

可以使用有点麻烦的 C# 6.0 语法

?.
(而不是
.
中的
userDescription.Contains

  if (userDescription?.Contains("Contracted") == true) {
    continue;
  }
  else {
    // Do Stuff here
  }

不幸的是(在这种特殊情况下)

Boolean?
不能被隐式转换为
Boolean
,这就是为什么应该添加
== true
。如果是
IndexOf
,代码看起来相当不错:

  if (userDescription?.IndexOf("Contracted") > -1) {
    continue;
  }
  else {
    // Do Stuff here
  }

2
投票

您可以覆盖

Contains()
IndexOf
并定义自定义输出,以防字符串为空,如下所示:

public static class Extensions
{
    public static bool Contains(this string value, string search)
    {
        if(value != null)
        {
            return value.Contains(search);

        }
        else
        {
            // IF ITS NULL DEFINE YOUR RETURN HERE
        }
        return false;
    }

    public static int IndexOf(this string value, string search)
    {
        if(value != null)
        {
            return value.IndexOf(search);
        }
        else
        {
            // IF ITS NULL DEFINE YOUR RETURN HERE
        }
        return -1;
    }
}

除了空值行为之外,用法保持不变。看我的评论。


0
投票

在 C# 6 之前使用

string.IsNullOrEmpty
(或 James Dev 的答案)是必要的

var userDescription = (string)userDirectoryData.Properties["description"].Value;
if (!string.IsNullOrEmpty(userDescription) && userDescription.IndexOf("Contracted") > -1)
{
    continue;
}
else
{
    //Do Stuff here
}

使用 C# 6,您可以将其简化为空传播运算符 (

?.
):

if ((string)userDirectoryData.Properties["description"].Value?.IndexOf("Contracted") > -1)
{
    continue;
}
else
{
    //Do Stuff here
}
© www.soinside.com 2019 - 2024. All rights reserved.