【问题标题】:Check if dictionary value of key is null检查键的字典值是否为空
【发布时间】:2020-06-10 09:14:29
【问题描述】:

我尝试使用字典,需要检查键的值(称为名称)是否为空,如果是,则使用一些默认字符串作为我的键的值,例如“未知”。

我知道我可以检查一个字符串,例如使用string.Length == 0,但我的问题是我有一个对象作为值,我很难抓住它。

这是我的代码:

 IDictionary<string, object> parameters = new Dictionary<string, object>();
 string Name = de.Properties["Name"].Value.ToString(); //Name is sometimes empty and sometimes not
 parameters.Add("Name", Name);

更新:

IDictionary<string, object> parameters = new Dictionary<string, object>();
string Name = de.Properties["Name"].Value.ToString();
 if (parameters.TryGetValue("Name", out var Name))
    {
      parameters.Add("Name", Name ?? "unknown");
    }

【问题讨论】:

  • null 和空的,即"" 是不同的东西。一个空字符串有一个值——它是空的。 null 表示没有价值。您可以使用String.IsNullOrEmpty 来检查两者。

标签: c# .net string dictionary


【解决方案1】:

null 和空字符串是完全不同的东西。 null 表示没有值,而空字符串 is 是字符串,它只是空的。你不能在 null 上调用 .ToString().Length,你会得到一个异常,因为没有处理这个调用的价值。

您可以使用Dictionary.TryGetValue 来检查是否存在并同时检索值。

之后,如果您真的想将所有内容都转换为字符串,您可以使用null-conditional operator ?. 调用ToString() 而不会在name 为空时抛出。如果name 为空,则整个表达式name?.ToString() 的计算结果也为null

然后您可以使用null-coalescing operator ?? 将空值替换为默认值:

var de= new Dictionary<string, object?>();
de["Name1"]=null;
de["Name2"]=42;

if(de.TryGetValue("Name2",out var name))
{
    var valueAsString=name?.ToString() ;
    parameters.Add("Name2", valueAsString ?? "unknown");
}

如果你只想用默认值替换空值,你不需要ToString()

if(de.TryGetValue("Name2",out var name))
{
    parameters.Add("Name2", name ?? "unknown");
}

如果要检查null或空,可以使用String.IsNullOrEmpty

if(de.TryGetValue("Name2",out var name))
{
    var newValue=String.IsNullOrEmpty(name) 
                       ? "unknown" 
                       : name.ToString();  //Only if we want to format to strings
    parameters.Add("Name2", newValue);
}

最后,如果您想替换 parameters 字典中的现有键,请使用

parameters["Name2]= newValue;

【讨论】:

  • @CodeCase 如果Name 已经存在,则非常有意义。不过,您没有问如何查看parameters 字典,而是问了如何查看de。如果要替换或添加,请使用parameters["Name2"]=newValue,而不是Add
【解决方案2】:

您可以尝试使用ContainsKey 方法检查字典中是否存在Name 键。然后通过使用null-conditional ?. operator 检查null 来获取实际的字符串值。如果结果为null 或空字符串,则将名称设置为unknown

if (de.Properties.ContainsKey("Name"))
{
    var name = de.Properties["Name"]?.ToString();
    if (string.IsNullOrEmpty(name))
    {
        name = "unknown";
    }
}

【讨论】:

  • 在多线程情况下要小心:在检查和获取之间,项目可能会被另一个线程删除。使用锁定或 TryGetValue 调用
猜你喜欢
  • 2022-07-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多