9

有没有办法调用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 吗?

4

4 回答 4

12

您可以使用TryGetValue

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

TryGetValue如果它包含指定的键,则返回 true,否则返回 false。

于 2013-06-30T00:22:02.747 回答
9

选择的答案是正确的。这是为 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
于 2013-06-30T00:43:51.863 回答
1

出于您的目的,这可能应该这样做。就像您在问题中所问的那样,一口气将 null 或 value 放入一个对象中:

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

或者..

int? result = _dictionary.ContainsKey("key") ? _dictionary["key"] : (int?)null;
于 2013-06-30T00:35:00.690 回答
0

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

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

不过,我不确定我是否会特别高兴使用它,通过结合 null 和您的“找到”条件,我会认为您只是将问题转移到稍微进一步的 null 检查。

于 2013-06-30T00:47:25.753 回答