Dav*_*ave 28 c# dictionary key-value generic-collections
我想一个添加KeyValuePair<T,U>到Dictionary<T, U>我没能做到.我必须分别传递密钥和值,这必然意味着Add方法必须创建一个新的KeyValuePair对象来插入,这不是非常有效.我不敢相信Add(KeyValuePair<T, U>)Add方法没有重载.任何人都可以提出这种明显疏忽的可能原因吗?
Dmi*_*ryG 33
您可以使用IDictionary<TKey,TValue>提供该Add(KeyValuePair<TKey,TValue>)方法的界面:
IDictionary<int, string> dictionary = new Dictionary<int, string>();
dictionary.Add(new KeyValuePair<int,string>(0,"0"));
dictionary.Add(new KeyValuePair<int,string>(1,"1"));
Run Code Online (Sandbox Code Playgroud)
Tim*_*ver 32
备份一分钟...在走向疏忽之路之前,你应该确定创建一个新的KeyValuePair是否真的如此低效.
首先,Dictionary类在内部不是作为一组键/值对实现的,而是作为一堆数组实现的.除此之外,让我们假设它只是一组KeyValuePairs并着眼于效率.
首先要注意的是KeyValuePair是一个结构.真正的含义是必须将它从堆栈复制到堆中才能作为方法参数传递.将KeyValuePair添加到字典时,必须再次复制它以确保值类型语义.
为了将Key和Value作为参数传递,每个参数可以是值类型或引用类型.如果它们是值类型,则性能将与KeyValuePair路由非常相似.如果它们是引用类型,这实际上可以是更快的实现,因为只需要传递地址并且必须进行非常少的复制.在最佳情况和最差情况下,由于KeyValuePair结构本身的开销增加,此选项略微优于KeyValuePair选项.
Ric*_*ard 15
有这样一种方法 - ICollection<KeyValuePair<K, T>>.Add但是在显式实现时,您需要将字典对象转换为该接口以访问它.
((ICollection<KeyValuePair<KeyType, ValueType>>)myDict).Add(myPair);
Run Code Online (Sandbox Code Playgroud)
看到
Dictionary<K, T>(您需要向下滚动).此方法的页面包含一个示例.