检查字典中键的值是否为空。

8

我尝试使用Dictionary,并需要检查一个键(称为Name)的值是否为空,如果为空,则将一些默认字符串用作我的键值,例如“unknown”。

我知道可以使用 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");
    }

2
null 和空字符串是不同的,空字符串有一个值 - 它是空的。null 表示没有值。你可以使用 String.IsNullOrEmpty 检查两者。 - Panagiotis Kanavos
3个回答

6
null和空字符串是完全不同的东西。null表示没有值,而空字符串就是一个字符串,只是为空。如果在null上调用.ToString().Length,会出现异常,因为没有值来处理这个调用。
您可以使用Dictionary.TryGetValue同时检查存在性并检索值。
之后,如果您真的想将所有内容转换为字符串,则可以使用空值条件运算符?.调用ToString(),而不会抛出异常。如果namenull,则整个表达式name?.ToString()也会计算为null
您可以使用空值合并运算符??将空值替换为默认值:
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;

如果 Name 已经存在,那么 @CodeCase 的意义就很清晰了。虽然你没有问如何检查 parameters 字典,但你问了如何检查 de。如果你想要替换或添加,请使用 parameters["Name2"] = newValue 而不是 Add - Panagiotis Kanavos

5
您可以尝试使用ContainsKey方法来检查字典中是否存在Name键。然后通过使用空值条件运算符?.检查null,从而获取实际字符串值。如果结果为null或空字符串,则将名称设置为unknown值。
if (de.Properties.ContainsKey("Name"))
{
    var name = de.Properties["Name"]?.ToString();
    if (string.IsNullOrEmpty(name))
    {
        name = "unknown";
    }
}

1
在多线程情况下要小心:在检查和获取项目之间,该项目可能会被另一个线程移除。请使用锁定或TryGetValue调用。 - Emond

-2

字符串结果 = (string)(YourDictionaryName.TryGetValue(key, out var value) ? YourDictionaryName["YourParameterName"].ToString(): "");


3
您的回答可以通过提供更多支持性信息来改进。请编辑并添加更多细节,例如引用或文献,以便其他人可以确认您的答案是否正确。您可以在帮助中心找到有关编写良好答案的更多信息。 - Community

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接