直接从字典获取KeyValuePair

我有System.Collections.Generic.Dictionary dict ,其中A和B是类,实例A a (其中dict.ContainsKey(a)为真)。

是否有可能直接从Dictionary中获取KeyValuePair?
或者我是否需要创建一个新的KeyValuePair: new KeyValuePair
(a, dict[a])

你需要创建一个新的KeyValuePair 1 – 但是请记住,KVP是一种值类型(结构),所以它并不像你通过这样做引入新的低效率。 任何返回KVP的方法都会创建一个副本 – 你只是直接创建实例。

如果需要,您可以随时向IDictionary添加扩展方法:

 public static KeyValuePair GetEntry (this IDictionary dictionary, TKey key) { return new KeyValuePair(key, dictionary[key]); } 

正如评论中所指出的,存储在字典中的密钥完全有可能与提供的密钥不同 ,只是在语义上相同 – 通过一些语义可以由IEqualityComparer定制(与不区分大小写的字典一样,用于例子。)在这种情况下,上面的代码不会返回字典中的实际条目,而是一个条目,其中包含您提供的密钥以供查找。 不幸的是,没有找到原始密钥的有效方法 – 你必须迭代字典:(


1我知道你可以迭代字典条目并找到相应的条目,但是当你有一个非常好的索引器是O(1)时,我看不出你为什么要这么做的理由而不是O(N)。

Dictionary实现IEnumerable> ,你可以使用linq:

 var pair = _dictionary.SingleOrDefault(p => p.Key == myKey); 

我们无法通过这种方式获得"IPHone"

 var dict = new Dictionary(StringComparer.OrdinalIgnoreCase) { { "IPHone", "TCP/IP honing tools" } }; Console.WriteLine(dict["iPhone"]); // "TCP/IP honing tools" Console.WriteLine( ??? ); // "IPHone" 

似乎没有使用当前API的O(1)解决方案,但循环遍历所有条目的工作原理:

 var keyValue = dict.First(p => dict.Comparer.Equals(p.Key, "iPhone")); Console.WriteLine(keyValue.Key); // "IPHone" Console.WriteLine(keyValue.Value); // "TCP/IP honing tools" 

或者作为懒惰的延伸:

 [Pure] public static KeyValuePair GetEntry(this Dictionary dictionary, TKey key) { var comparer = dictionary.Comparer; return dictionary.FirstOrDefault(p => comparer.Equals(p.Key, key)); } 

对我来说myDict.AsEnumerable是这样做的……