tags:

views:

467

answers:

6

What is the difference between a List of KeyValuePair and a Dictionary for the same types? Is there an appropriate time to use one or the other?

+5  A: 

In short, the list does not enforce uniqueness of either the key or the value, so if you need that semantic then that's what you should use.

RCIX
+5  A: 

When you don't need fast lookups on key - maintaining the hashtable used by Dictionary has a certain overhead.

Pavel Minaev
Also list insert operation is faster that the one in Dictionary
Vadmyst
+1  A: 

From http://blogs.msdn.com/bclteam/archive/2004/09/03/225473.aspx:

KeyValuePair vs. DictionaryEntry
[Krzysztof Cwalina]

We discussed a problem with implementation of IEnumerable on Dictionary<K,V>. What type should IEnumerable.GetEnumerator().Current return? KeyValuePair<K,V> or DictionaryEntry? Same for ICollection.CopyTo. Instances of what type should be copied to the array?

We decided the following: IEnumerable and ICollection interface implementations will use KeyValuePair<K,V> as the item type. IDictionary specific members (GetEnumerator returning IDictionaryEnumerator) will use DictionaryEntry as the item type.

The reason is that we are in a process of making a change where IEnumerator<T> would extend IEnumerator. It would be very strange if walking the hierarchy from Dictionary<K,V>->IEnumerable<T>->IEnumerable we suddenly changed the type of the item returned from enumerators.

Anax
A: 

In SOAP webservices for silverlight, we have found that Dictionary's do not serialize. This would be a situation where you would use a List of KeyValuePair over a Dictionary.

.

Phillip Ngan
+1  A: 

The List would also be useful when you care about the order of the items.

Andrew Medico
A: 

Further to Phillip Ngan's answer, SOAP or otherwise, you cannot XML serialize objects that implements IDictionary.

Q: Why can't I serialize hashtables?

A: The XmlSerializer cannot process classes implementing the IDictionary interface. This was partly due to schedule constraints and partly due to the fact that a hashtable does not have a counterpart in the XSD type system. The only solution is to implement a custom hashtable that does not implement the IDictionary interface.

from here

tjmoore