C#Dictionary相当于Python的get()方法

时间:2015-01-29 16:59:03

标签: c# python dictionary

在Python中,如果我有一个字典,并且我想从字典中获取密钥可能不存在的值,我会做类似的事情:

lookupValue = somedict.get(someKey, someDefaultValue)

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

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

var lookupValue;
if(!somedict.TryGetValue(someKey, lookupValue))
    lookupValue = someDefaultValue;

虽然有一个问题是,如果someKeynull,则会抛出异常,因此您将进行空检查:

var lookupValue = someDefaultValue;
if (someKey != null && !somedict.TryGetValue(someKey, lookupValue))
    lookupValue = someDefaultValue;

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

3 个答案:

答案 0 :(得分:4)

这是使用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;
}

当然,如果密钥为null,您实际上可能需要例外,因为它始终是字典的无效密钥。

答案 1 :(得分:1)

TryGetValue不是您要寻找的方法。此方法返回一个布尔值。如果找到密钥则为true,否则为false。如果找到密钥,则将值设置为您选择的变量。您想要的方法在Dictonary类中不存在。  因此,您有两种方法可以解决问题:

  1. 检查是否存在:

    var value;
    if (somedic.TryGetValue("key", out value))
       lookupValue  = value;
    else
       lookupValue = defaultValue;
    
  2. 创建您自己的方法,如blog所示。

答案 2 :(得分:1)

LINQ的SingleOrDefault()可以解决问题。

string s = "I can't believe how ugly this is!";
Dictionary<char, int> histogram = new Dictionary<char, int>();
foreach (char c in s)
{
    histogram[c] = histogram.Where(x => x.Key == c).SingleOrDefault().Value + 1;
}

不是很简洁或可读,但是,嘿,它是一个单行!

效率方面我不确定这会归结为什么。

当然,一旦您开始了LINQ路径,您可能会开始考虑其他方法来解决您正在处理的任何问题。