.NET Array Dictionary List String 2D Async DataTable Dates DateTime Enum File For Foreach Format IEnumerable If IndexOf Lambda LINQ Parse Path Process Property Regex Replace Sort Split Static StringBuilder Substring Switch Tuple


C#:.NET:Collections

StringDictionary is a specialized collection. It is found in the System.Collections Specialized namespace. It only allows string keys and string values. It is limited. It also suffers from performance problems.


Example. This program shows some methods on the StringDictionary. The constructor is called, and then Add is invoked. The indexer is tested. ContainsKey and ContainsValue are used. IsSynchronized is accessed and the enumerator is used.

Also: The Keys and Values properties are used in foreach-loops. The Remove, Count and Clear methods are demonstrated.

ConstructorIndexer
C# program that uses StringDictionary

using System;
using System.Collections;
using System.Collections.Specialized;

class Program
{
    static void Main()
    {
	// Create new StringDictionary.
	StringDictionary dict = new StringDictionary();
	dict.Add("cat", "feline");
	dict.Add("dog", "canine");

	// Try the indexer.
	Console.WriteLine(dict["cat"]);
	Console.WriteLine(dict["test"] == null);

	// Use ContainsKey.
	Console.WriteLine(dict.ContainsKey("cat"));
	Console.WriteLine(dict.ContainsKey("puppet"));

	// Use ContainsValue.
	Console.WriteLine(dict.ContainsValue("feline"));
	Console.WriteLine(dict.ContainsValue("perls"));

	// See if it is thread-safe.
	Console.WriteLine(dict.IsSynchronized);

	// Loop through pairs.
	foreach (DictionaryEntry entry in dict)
	{
	    Console.WriteLine("{0} = {1}", entry.Key, entry.Value);
	}

	// Loop through keys.
	foreach (string key in dict.Keys)
	{
	    Console.WriteLine(key);
	}

	// Loop through values.
	foreach (string value in dict.Values)
	{
	    Console.WriteLine(value);
	}

	// Use Remove method.
	dict.Remove("cat");
	Console.WriteLine(dict.Count);

	// Use Clear method.
	dict.Clear();
	Console.WriteLine(dict.Count);
    }
}

Output

feline
True
True
False
True
False
False
dog = canine
cat = feline
dog
cat
canine
feline
1
0

Internals. How is the StringDictionary type internally implemented? It simply uses a Hashtable member field to store all the data you add. The Hashtable is not a generic type so it will have some overhead.

Hashtable

Also: Every time you look up a key the key is converted to lowercase, adding more overhead.


Performance. This section describes the performance characteristics of the StringDictionary. Every time you access a string key, it is converted to lowercase, which allocates on the managed heap.

ToLower

But: Other than this, performance is roughly the same as a Hashtable. Because of these shortcomings, detailed benchmarks are not useful.

Benchmark Programs

Tip: For better performance, use a Dictionary generic type with string keys. And prefer the StringComparer.Ordinal option.

DictionaryDictionary StringComparer

Summary. The StringDictionary has few unique advantages. Its underlying collection, the Hashtable, is also obsolete because of the faster and cleaner Dictionary generic type. It is probably useless in almost all programs and should be avoided.