如果键不存在,C # Dictionary < int,int > 查找会发生什么?

我尝试检查 null,但编译器警告说这种情况永远不会发生。我应该找什么?

141999 次浏览

如果您只是在尝试添加新值之前进行检查,请使用 ContainsKey方法:

if (!openWith.ContainsKey("ht"))
{
openWith.Add("ht", "hypertrm.exe");
}

如果您正在检查该值是否存在,请使用 Jon Skeet 的答案中描述的 TryGetValue方法。

在尝试提取值之前,应该检查 Dictionary. ContainsKey (int key)。

Dictionary<int, int> myDictionary = new Dictionary<int, int>();
myDictionary.Add(2,4);
myDictionary.Add(3,5);


int keyToFind = 7;
if(myDictionary.ContainsKey(keyToFind))
{
myValueLookup = myDictionay[keyToFind];
// do work...
}
else
{
// the key doesn't exist.
}

ContainsKey 就是您要寻找的。

你或许应该使用:

if(myDictionary.ContainsKey(someInt))
{
// do something
}

不能检查 null 的原因是这里的键是一个值类型。

假设您希望在键 是的存在的情况下获取该值,那么使用 Dictionary<TKey, TValue>.TryGetValue:

int value;
if (dictionary.TryGetValue(key, out value))
{
// Key was in dictionary; "value" contains corresponding value
}
else
{
// Key wasn't in dictionary; "value" is now 0
}

(使用 ContainsKey,然后使用索引器使其向上查找两次密钥,这是非常无意义的。)

请注意,即使您使用引用类型的 曾经是,检查 null 也不会起作用——如果您请求丢失的键,Dictionary<,>的索引器将抛出异常,而不是返回 null。(这是 Dictionary<,>Hashtable之间的一个很大的区别。)

如果字典不包含您的键,则字典引发 KeyNotFound异常。

正如所建议的,ContainsKey是适当的预防措施。 TryGetValue也是有效的。

这允许字典更有效地存储 null 值。如果没有这种行为,检查来自[]操作符的 null 结果将表明要么是 null 值,要么是输入键不存在,这是不好的。

Helper 类很方便:

public static class DictionaryHelper
{
public static TVal Get<TKey, TVal>(this Dictionary<TKey, TVal> dictionary, TKey key, TVal defaultVal = default(TVal))
{
TVal val;
if( dictionary.TryGetValue(key, out val) )
{
return val;
}
return defaultVal;
}
}
int result= YourDictionaryName.TryGetValue(key, out int value) ? YourDictionaryName[key] : 0;

如果字典中存在该键,则返回该键的值,否则返回0。

霍普,这个密码对你有帮助。

考虑封装这个特定字典的选项,并提供一个方法来返回该键的值:

public static class NumbersAdapter
{
private static readonly Dictionary<string, string> Mapping = new Dictionary<string, string>
{
["1"] = "One",
["2"] = "Two",
["3"] = "Three"
};


public static string GetValue(string key)
{
return Mapping.ContainsKey(key) ? Mapping[key] : key;
}
}

然后你就可以管理这本字典的行为了。

例如这里: 如果字典没有密钥,它将返回您通过参数传递的密钥。