2013-06-30 47 views
6

有没有办法一次为Dictionary<string, int>找到一个键的值?现在我正在打两个电话。词典包含键和在一个函数中获取值

if(_dictionary.ContainsKey("key") { 
int _value = _dictionary["key"]; 
} 

我想要做它喜欢:

object _value = _dictionary["key"] 
//but this one is throwing exception if there is no such key 

我想如果返回null不存在这样的键或一个电话获得的价值?

回答

9

,如果它包含指定键可以使用TryGetValue

int value; 
bool exists = _dictionary.TryGetValue("key", out value); 

TryGetValue返回true,否则为false。

+2

如果字典包含带有该键的元素,则TryGetValue将返回true,否则返回false。 – Femaref

+0

如果他有一个像{“key”,0}这样的键/值对,并且他试图从一个不存在的键中获取该值,那么该int值将为0。 – terrybozzio

+0

@terrybozzio在这种情况下'exists'将会是'false' –

1

这应该可能做到这一点,为您的目的。 就像你问的问题,让所有一气呵成,null或值,到一个对象:

object obj = _dictionary.ContainsKey("key") ? _dictionary["key"] as object : null; 

或..

int? result = _dictionary.ContainsKey("key") ? _dictionary["key"] : (int?)null; 
+0

这是'O(| keys |)'。我们可以做得更好。 – jason

+0

“键”是一个字典中作为键的示例,而不是 - 获取键 - – terrybozzio

+0

我明白这一点。但是'Enumerable.Where'会对所有的键进行线性搜索。这就是为什么它的键数量是线性的。通过'|键|'表示键的数量给出了'O(|键|)'。 – jason

7

所选答案正确的。这是供应商user2535489以实现他的想法的正确方法:

public static class DictionaryExtensions 
{ 
    public static TValue GetValue<TKey, TValue>(this IDictionary<TKey, TValue> dictionary, TKey key, TValue fallback = default(TValue)) 
    { 
     TValue result; 

     return dictionary.TryGetValue(key, out result) ? result : fallback; 
    } 
} 

然后可以与使用:

Dictionary<string, int> aDictionary; 
// Imagine this is not empty 
var value = aDictionary.GetValue("TheKey"); // Returns 0 if the key isn't present 
var valueFallback = aDictionary.GetValue("TheKey", 10); // Returns 10 if the key isn't present 
+0

如果您从字典或后备中获得价值,仍然无法知道。我没有看到像这样包装'TryGetValue'的任何价值。 – spender

+1

你是对的。但是如果用户关心密钥是否在字典中,用户可以选择使用'TryGetValue'。如果他不在乎并且想要一个班轮,那只是语法糖。因为我觉得我失去控制,我个人不会使用我的主张。这纯粹是为了讨论。 –

0

我想,你可以做这样的事情(或写更清晰的扩展方法)。

 object _value = _dictionary.ContainsKey(myString) ? _dictionary[myString] : (int?)null; 

我不知道我会用特别高兴的是,虽然,结合空和你“发现”的条件,我还以为你只是换挡的问题,以空校验略微进一步下线。

相关问题