use*_*783 32 .net c# generics collections dictionary
我有System.Collections.Generic.Dictionary<A, B> dict
A和B是类和一个实例A a
(其中dict.ContainsKey(a)
是真的).
是否有可能a
直接从Dictionary中获取KeyValuePair ?
或者,我需要创建一个新的KeyValuePair: new KeyValuePair<A, B>(a, dict[a])
?
Jon*_*eet 39
你需要创建一个新的KeyValuePair
1 - 但请记住,KVP无论如何都是一个值类型(结构),所以这并不像你通过这样做引入新的低效率.任何返回KVP的方法都会创建一个副本 - 你只是直接创建实例.
如果需要,您可以随时添加扩展方法IDictionary<TKey, TValue>
:
public static KeyValuePair<TKey, TValue> GetEntry<TKey, TValue>
(this IDictionary<TKey, TValue> dictionary,
TKey key)
{
return new KeyValuePair<TKey, TValue>(key, dictionary[key]);
}
Run Code Online (Sandbox Code Playgroud)
正如评论中所指出的,存储在字典中的密钥完全有可能与提供的密钥不同,只是在语义上相等 - 通过某些语义可以由一个IEqualityComparer
(例如,不区分大小写的字典)定制..)在这种情况下,上面的代码不会返回字典中的实际条目,而是返回您提供的用于查找的键的条目.不幸的是,没有找到原始密钥的有效方法 - 你必须迭代字典:(
1我知道你可以迭代字典条目并找到相应的条目,但是当你有一个非常好的索引器是O(1)时,我看不出你为什么要这么做的理由而不是O(N).
Oli*_*ppi 18
作为Dictionary<TKey, TValue>
工具IEnumerable<KeyValuePair<TKey, TValue>>
,您可以使用linq:
var pair = _dictionary.SingleOrDefault(p => p.Key == myKey);
Run Code Online (Sandbox Code Playgroud)