NameValueCollection vs Dictionary<string,string>
C#.NetCollectionsDictionaryNamevaluecollectionC# Problem Overview
> Possible Duplicate:
> IDictionary<string, string> or NameValueCollection
Any reason I should use Dictionary<string,string> instead of NameValueCollection?
(in C# / .NET Framework)
Option 1, using NameValueCollection:
//enter values:
NameValueCollection nvc = new NameValueCollection()
{
{"key1", "value1"},
{"key2", "value2"},
{"key3", "value3"}
};
// retrieve values:
foreach(string key in nvc.AllKeys)
{
string value = nvc[key];
// do something
}
Option 2, using Dictionary<string,string>...
//enter values:
Dictionary<string, string> dict = new Dictionary<string, string>()
{
{"key1", "value1"},
{"key2", "value2"},
{"key3", "value3"}
};
// retrieve values:
foreach (KeyValuePair<string, string> kvp in dict)
{
string key = kvp.Key;
string val = kvp.Value;
// do something
}
For these use cases, is there any advantage to use one versus the other? Any difference in performance, memory use, sort order, etc.?
C# Solutions
Solution 1 - C#
They aren't semantically identical. The NameValueCollection
can have duplicate keys while the Dictionary
cannot.
Personally if you don't have duplicate keys, then I would stick with the Dictionary
. It's more modern, uses IEnumerable<>
which makes it easy to mingle with Linq
queries. You can even create a Dictionary
using the Linq
ToDictionary()
method.
Solution 2 - C#
NameValueCollection
is string
typed whereas Dictionary
leverages generics to allow type variance. See Benefits of Generics.
Solution 3 - C#
Dictionary
will be much faster. NameValueCollection
allows duplicate keys. Which could be bad in certain situations, or desired in other. Dictionary
does not allow duplicate keys.
From: http://msdn.microsoft.com/en-us/library/xfhwa508.aspx
> The Dictionary<(Of <(TKey, TValue>)>)
> generic class provides a mapping from
> a set of keys to a set of values. Each
> addition to the dictionary consists of
> a value and its associated key.
> Retrieving a value by using its key is
> very fast, close to O(1)
, because the
> Dictionary<(Of <(TKey, TValue>)>)
> class is implemented as a hash table.