使用键获取存储在字典中的对象

本文关键字:字典 对象 存储 获取 | 更新日期: 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