不能直接添加到keyValuePair词典(Can't add keyValuePair d

2019-07-01 17:34发布

我想添加一个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



文章来源: Can't add keyValuePair directly to Dictionary