我想添加一个KeyValuePair<T,U>
到Dictionary<T, U>
和我不能。 我必须通过键和独立的价值,这必然意味着Add方法必须创建一个新的KeyValuePair对象插入,不能是非常有效的。 我不能相信没有一个Add(KeyValuePair<T, U>)
上的添加方法过载。 任何人都可以提出这种明显的疏忽可能的原因是什么?
Answer 1:
备份一分钟......之前下降的监督之路,你应该确定是否创建一个新的KeyValuePair真是如此低效。
首先,Dictionary类内部没有实现为一组键/值对,但作为一束阵列。 这且不说,我们假设这只是一组KeyValuePairs的,看看效率。
首先要注意的事情是, KeyValuePair是一个结构。 的,真正的含义是,它必须从堆栈到堆,以便复制作为方法参数传递。 当KeyValuePair被添加到词典中,它必须被复制的第二时间,以确保值类型的语义。
为了通过键和值作为参数,每个参数可以是一个值类型或引用类型。 如果他们是值类型,性能将是非常相似的KeyValuePair路线。 如果他们是引用类型,这其实是可以更快的实现,因为只有地址需要被传来传去,很少复制有许多工作要做。 在这两种情况下,最好和最坏的情况下,这个选项是稍微比KeyValuePair选项更好地由于KeyValuePair增加的开销结构本身。
Answer 2:
可以使用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"));
Answer 3:
有这样一个方法- ICollection<KeyValuePair<K, T>>.Add
但因为它明确地实现你需要投你的字典对象到该接口来访问它。
((ICollection<KeyValuePair<KeyType, ValueType>>)myDict).Add(myPair);
看到
- 在显式接口实现的列表
Dictionary<K, T>
的文档页面(你需要向下滚动)。 - 显式成员实现
的页面上该方法包括一个例子。
Answer 4:
除非我记错了,.NET 4.5和4.6增加了一个KeyValuePair添加到字典的能力。 (如果我错了,只是通知我,我会删除这个答案。)
https://msdn.microsoft.com/en-us/library/cc673027%28v=vs.110%29.aspx
从上面的链接,相关的一条信息是这样的代码例如:
public static void Main()
{
// Create a new dictionary of strings, with string keys, and
// access it through the generic ICollection interface. The
// generic ICollection interface views the dictionary as a
// collection of KeyValuePair objects with the same type
// arguments as the dictionary.
//
ICollection<KeyValuePair<String, String>> openWith =
new Dictionary<String, String>();
// Add some elements to the dictionary. When elements are
// added through the ICollection<T> interface, the keys
// and values must be wrapped in KeyValuePair objects.
//
openWith.Add(new KeyValuePair<String,String>("txt", "notepad.exe"));
openWith.Add(new KeyValuePair<String,String>("bmp", "paint.exe"));
openWith.Add(new KeyValuePair<String,String>("dib", "paint.exe"));
openWith.Add(new KeyValuePair<String,String>("rtf", "wordpad.exe"));
...
}
如可以看到的,则创建类型字典的一个新对象,并呼吁openWith
。 然后一个新的KVP对象被创建并添加到openWith
使用.Add
方法。
Answer 5:
如果有人真的要做到这一点,这里是一个扩展
public static void Add<T, U>(this IDictionary<T, U> dic, KeyValuePair<T, U> KVP)
{
dic.Add(KVP.Key, KVP.Value);
}
但我会建议不这样做,如果没有真正的需要做到这一点
Answer 6:
只是因为Dictionary类枚举返回一个KeyValuePair,并不意味着是它是如何在内部实现。
使用IDictionary的,如果你真的需要通过KVP的,因为你已经在该格式得到了他们。 否则使用赋值或只使用Add方法。
Answer 7:
什么是错只是将它添加到您的项目作为一个扩展?
namespace System.Collection.Generic
{
public static class DictionaryExtensions
{
public static void AddKeyValuePair<K,V>(this IDictionary<K, V> me, KeyValuePair<K, V> other)
{
me.Add(other.Key, other.Value);
}
}
}
Answer 8:
我不是100%肯定,但我认为内部实现一个字典是一个哈希表,这意味着关键的转换成散列执行快速查找窗口。
有读到这里,如果你想知道更多关于哈希表
http://en.wikipedia.org/wiki/Hash_table