使用键获取存储在字典中的对象
本文关键字:字典 对象 存储 获取 | 更新日期: 2023-09-27 18:20:33
我使用Dictionary对象(C#)来存储键(字符串)和值(object)对。
我能够毫无问题地将对象存储在字典中。然而,访问它们对我来说不起作用。
这是我想出的代码:
Object con;
if (dict.ContainsKey(theKey))
{
con = dict.FirstOrDefault(x => x.Value == theKey).Key;
}
else
{
throw new Exception("Connection instance unavailable : " + theKey);
}
由于某种原因,con
总是返回空。
使用此:
if (dict.ContainsKey(theKey))
{
con = dict[theKey];
}
以下是LinqPad的一个小脚本:
var dictionary = new Dictionary<String, Object>();
dictionary.Add("myKey", new Object());
var myKey = "myKey";
Object con;
if (dictionary.ContainsKey(myKey))
{
con = dictionary[myKey];
// con is populated
}
此外,您可以在DotnetFiddle 中看到
根据Matthew Watson的评论,使用以下方法比ContainsKey
更有效:
if (dictionary.TryGetValue(myKey, out con))
{
// con is populated again
}
此代码执行一次搜索,其中ContainsKey
和[]
执行两次搜索。
您必须使用字典的索引器:
dict.Add("MyKey", new Object());
var result = dict["MyKey"];
我猜您在FirstOrDefault
中的比较是错误的,您正在通过将给定密钥与此处的Value
进行比较来查找KeyValuePair
:
FirstOrDefault(x => x.Value == theKey) // pointless
但是您根本不需要循环字典,您应该使用索引器或TryGetValue
。由于您已经检查了密钥的存在,您可以安全地使用:
con = dict[theKey];
但是,如果您缺少一个同时提供密钥和值的方法,即给定密钥的KeyValuePair
,则可以使用以下扩展方法:
public static KeyValuePair<TKey, TValue>? TryGetKeyValue<TKey, TValue>(this IDictionary<TKey, TValue> dictionary, TKey key)
{
TValue value;
if (dictionary.TryGetValue(key, out value))
{
return new KeyValuePair<TKey, TValue>(key, value);
}
return null;
}
现在,您不需要使用FirstOrDefault
循环所有条目即可获得它:
var dict = new Dictionary<string, object>();
dict.Add("1", "A");
KeyValuePair<string, object>? pair = dict.TryGetKeyValue("1");
如果未找到密钥,则pair.HasValue
返回false
。