c# - 直接从 Dictionary<> 获取 KeyValuePair<>

标签 c# .net generics collections dictionary

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

是否可以得到包含a的KeyValuePair?直接来自字典?
或者我是否需要创建一个新的 KeyValuePair:new KeyValuePair<A, B>(a, dict[a])

最佳答案

您需要创建一个新的 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]);
}

如注释中所述,存储在字典中的键完全有可能与提供的键相同,只是在语义上相同——通过一些可以由 IEqualityComparer 自定义的语义(例如,与不区分大小写的字典一样。)在这种情况下,上面的代码不会返回字典中的实际条目,而是返回一个包含您提供的用于查找的键的条目。不幸的是,没有找到原始 key 的有效方法 - 你必须遍历字典:(


1 我知道您可以遍历字典条目并以这种方式找到合适的条目,但我看不出您有什么理由想要这样做一个非常好的索引器,它是 O(1) 而不是 O(N)。

关于c# - 直接从 Dictionary<> 获取 KeyValuePair<>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1619090/

相关文章:

c# - 非静态方法需要一个目标。找不到似乎有效的答案

c# - 如何在包含不同签名但参数全部对应于同一类型的类型上构造接口(interface)

c# - 在 C# 中对 IList 进行排序

c# - 使用对通用对象的引用作为参数

c# - CSharpCodeProvider 在编译期间使用自定义参数

c# - 使用 WPF/MVVM 在运行时动态更改 UserControl 内容

.net - Visual Studio 2010 : The report definition is not valid. 详细信息:报表定义具有无效目标

c# - 我可以从 ASP.NET 应用程序外部的 ASP.NET 页面对象呈现 html 吗?

.net - Web 应用和函数应用的 Azure 全局应用程序设置

java - 出于测试目的注入(inject)通用 stub