【发布时间】:2015-01-29 16:59:02
【问题描述】:
在 Python 中,如果我有一个 dict,并且我想从一个可能不存在键的 dict 中获取一个值,我会这样做:
lookupValue = somedict.get(someKey, someDefaultValue)
如果someKey 不存在,则返回someDefaultValue。
在 C# 中,TryGetValue() 有点相似:
var lookupValue;
if(!somedict.TryGetValue(someKey, lookupValue))
lookupValue = someDefaultValue;
一个问题是,如果 someKey 是 null 则会引发异常,因此您需要进行空值检查:
var lookupValue = someDefaultValue;
if (someKey != null && !somedict.TryGetValue(someKey, lookupValue))
lookupValue = someDefaultValue;
哪个,TBH,是 icky(3 行用于 dict 查找?)是否有更简洁(即 1 行)的方式,很像 Python 的 get()?
【问题讨论】:
-
Afaik 没有这样的方法。但是您始终可以定义自己的扩展来包装这三行。或者您可以使用三元来获得单线,但这与您的方法没有什么不同
-
我认为三元仍然不会是一个单行,因为你必须在
TryGetValue之前声明lookupValue对吗? -
@AdamParkin 是的,您必须首先声明传递给
TryGetValue的输出值是绝对正确的。尽管var value = key != null && dic.ContainsKey(key) ? dic[key] : defaultValue;,但您可以为单行执行此操作,这比TryGetValue效率低,因为当键在字典中时它会进行两次查找。 -
当然可以,但是字典键是散列的,所以它仍然是常数时间(即 O(1) + O(1) == O(1))对吧?
-
@AdamParkin 没错,复杂性并没有改变,但是做两次总是比做一次需要更长的时间。
标签: c# python dictionary