Introduction
A StringTreeDictionary<T>
class implements a IDictionary<string, T>
interface and is 57% faster than a Dictionary<string, T>
at a task described below, 50% slower at adding items and much slower at accessing them. Even so it can be useful if you have to translate a sequence of characters.
Using the Code
A method, MatchKey
, provided in a class tries to find a key in a dictionary which matches the beginning of a given string
. If the key was found, then it returns a KeyValuePair<string, TKey>
object. Otherwise a KeyNotFoundException
is thrown. For example, if a dictionary would contain keys aaba
, ac
, ccbc
and abcd
, then the MatchKey("accdba")
would retaurn a pair {"ac", dict["ac"]}
. Note that we do not know a length of a key we are searching for. The method can be used to extract a sequence of meaningful string
s (keys) from a continuous stream of characters.
How It Works
Internally, the StringTreeDictionary
object represents a node of a tree structure. There are the following fields inside:
public class StringTreeDictionary<T> : IDictionary<string, T>
{
private T value;
private bool hasValue = false;
private Dictionary<char, StringTreeDictionary<T>> childs = null;
A single StringTreeDictionary
object contains just one value and a dictionary with child nodes as values and chars
as keys. Let's see how the items are stored.

Such a dictionary could be instantinated this way:
StringTreeDictionary<string> std = new StringTreeDictionary<string> {
{"bear", "sleuth"},
{"bee", "grist"},
{"bird", "flock"},
{"cat", "clowder"}
};
The diagram clearly shows that the dictionary does not like long keys.
Remarks
- A
StringTreeDictionary<T>
is good only for very specific cases; do not use it instead of a standard .NET dictionary. - Accessing items with keys longer than 3 characters is terribly slow and is not recommended.
- The dictionary does not support a true item removal. A faked
Remove
method only disallows accessing deleted items and sets value
to default(TValue)
, but does not detach unused nodes. - The
MatchKey
method searches for the shortest key matching a string
's beginning. If you would add keys acx
and ac
, then the acx
would never be found.
History
- 2008-09-20 - First version posted
- 2008-09-20 - Download files updated