相当于Python的C#字典';s get()方法
在Python中,如果我有一个dict,并且我想从一个dict中获取一个值,其中键可能不存在,我会执行以下操作:相当于Python的C#字典';s get()方法,c#,python,dictionary,C#,Python,Dictionary,在Python中,如果我有一个dict,并且我想从一个dict中获取一个值,其中键可能不存在,我会执行以下操作: lookupValue = somedict.get(someKey, someDefaultValue) 其中,如果someKey不存在,则返回someDefaultValue 在C#中,有一个类似的TryGetValue(): var lookupValue; if(!somedict.TryGetValue(someKey, lookupValue)) lookupV
lookupValue = somedict.get(someKey, someDefaultValue)
其中,如果someKey
不存在,则返回someDefaultValue
在C#中,有一个类似的TryGetValue()
:
var lookupValue;
if(!somedict.TryGetValue(someKey, lookupValue))
lookupValue = someDefaultValue;
不过,其中一个问题是,如果someKey
为null
,则会引发异常,因此需要进行null检查:
var lookupValue = someDefaultValue;
if (someKey != null && !somedict.TryGetValue(someKey, lookupValue))
lookupValue = someDefaultValue;
有没有一种更简洁(即1行)的方法,很像Python的
get()
?TryGetValue不是您要寻找的方法。此方法返回一个布尔值。如果找到键,则为True;如果未找到,则为false。如果找到键,则将为您选择的变量设置值。您想要的方法在dictorial类中不存在。
因此,您有两种解决问题的方法:
var value;
if (somedic.TryGetValue("key", out value))
lookupValue = value;
else
lookupValue = defaultValue;
下面是使用
TryGetValue
的正确方法。请注意,在调用TryGetValue
之前,您不能将返回值设置为默认值,只需将其返回,因为TryGetValue
将在找不到键时将其重置为默认值
public static TValue GetOrDefault<TKey, TValue>(
this IDictionary<TKey, TValue> dictionary,
TKey key,
TValue defaultValue)
{
TValue value;
if(key == null || !dictionary.TryGetValue(key, out value))
return defaultValue;
return value;
}
恐怕没有这样的办法。但您始终可以定义自己的扩展来包装这三行。或者你可以使用三元来表示一行,但这与你的方法没有太大区别。我认为三元仍然不是一行,因为你必须在
TryGetValue
之前声明lookupValue
,对吗?@AdamParkin是的,您必须首先声明传递给TryGetValue
的out值,这是绝对正确的。您可以通过var value=key!=空和dic.ContainsKey(键)?dic[键]:默认值
这比TryGetValue
效率低,因为当键在字典中时,它会执行两次查找。当然,但dict键是散列的,所以它仍然是常量时间(即O(1)+O(1)==O(1)),对吗?@AdamParkin True,复杂性不会改变,但是做两次总是比做一次要花费更长的时间。你还必须检查密钥是否为null,除非你将密钥类型设置为不可为null的结构(除非你想在密钥为null时引发异常)。是的,没错。所以最好按照博客中所示实现它。博客也不会测试密钥是否为null。该方法将为null键引发异常,但这可能是正确的操作过程,也可能不是正确的操作过程,但如果该键为null,则OP似乎需要默认值。
return key == null || !dictionary.TryGetValue(key, out var value)
? defaultValue
: value;