C# 字典等效于 Python 的 get() 方法

Ada*_*kin 5 c# python dictionary

在 Python 中,如果我有一个 dict,并且我想从一个可能不存在密钥的 dict 中获取一个值,我会执行以下操作:

lookupValue = somedict.get(someKey, someDefaultValue)
Run Code Online (Sandbox Code Playgroud)

其中,如果someKey不存在,则someDefaultValue返回。

在 C# 中,有些TryGetValue()类似:

var lookupValue;
if(!somedict.TryGetValue(someKey, lookupValue))
    lookupValue = someDefaultValue;
Run Code Online (Sandbox Code Playgroud)

一个问题是,如果someKeynull然后抛出异常,所以你进行了空检查:

var lookupValue = someDefaultValue;
if (someKey != null && !somedict.TryGetValue(someKey, lookupValue))
    lookupValue = someDefaultValue;
Run Code Online (Sandbox Code Playgroud)

哪个,TBH,是 icky(3 行用于 dict 查找?)有没有更简洁(即 1 行)的方式,很像 Python 的get()

juh*_*arr 6

这是正确的使用方法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;
}
Run Code Online (Sandbox Code Playgroud)

当然,如果 key 是null,您可能实际上想要一个例外,因为这对于字典来说总是一个无效的键。

现在可以使用 C# 7.0 内联输出变量声明将其简化为以下内容。

return key ==  null || !dictionary.TryGetValue(key, out var value)
    ? defaultValue
    : value;
Run Code Online (Sandbox Code Playgroud)