繁体   English   中英

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

[英]Using String.Contains on a Null value string

在我的应用程序中,我从 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#可空合并分配一个空字符串:

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

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

有点复杂的 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
  }

您可以覆盖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;
    }
}

除了具有空值的行为外,用法保持不变。 检查我的评论。

在 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
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM