C# StringDictionary

String type

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.

String Type

Example

Program icon

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.

ConstructorIndexerForeach
Program that uses StringDictionary: C#

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

Framework: NET

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

Garbage collection visualization

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.


C#: Collections