字典和哈希表相似,是一系列键值对的集合,它的定义(构造器)是:
// 初始化一个空字典
public Dictionary<TKey, TValue> dictionaryName = new Dictionary<TKey, TValue>();
// 初始化一个有初始容量的字典
public Dictionary<TKey, TValue> dictionaryName = new Dictionary<TKey, TValue>(int capacity);
// 初始化一个有初始容量和比较器的字典
public Dictionary<TKey, TValue> dictionaryName = new Dictionary<TKey, TValue>(int capacity, IEqualityComparer<TKey> comparer);
与哈希表不同,字典是一种泛型数据类型,因而避免了拆装箱的性能消耗。
同时与哈希表一样,字典的检索速度非常快,接近O(1)
// 添加元素 // 如果新增元素的键已经存在,则抛出ArgumentException,需要注意。
dictionary.Add(TKey, TValue);
// 删除元素 // 如果删除元素的键不存在,则抛出KeyNotFoundException,需要注意。
dictionary.Remove(TKey);
// 访问/更改元素 // 如果访问的元素不存在,则抛出KeyNotFoundException
dictionary[TKey] = AnotherTValue;
// 查询元素(返回布尔值)
dictionary.ContainsKey(TKey)
关于字典还有一些比较神奇的功能。我们可以单独获取字典的键或者值的集合。
// Dictionary.ValueCollection获取值的集合
Dictionary<Tkey, TValue>.ValueCollection valueColl = dictionary.Values;
// 用foreach遍历
foreach(TValue value in valueColl) { Console.WriteLine(value); }
// Dictionary.KeyCollection获取键的集合
Dictionary<Tkey, TValue>.KeyCollection keyColl = dictionary.Keys;
// 用foreach遍历
foreach(TKey key in keyColl) { Console.WriteLine(key); }
// Dictionary.KeyValuePair获取键值对的集合
Dictionary<Tkey, TValue>.KeyValuePair keyValuePair = dictionary.KeyValuePair;
// 用foreach遍历
foreach(KeyValuePair<TKey, TValue> pair in keyValuePair) { Console.WriteLine(pair.Key + " : " + pair.Value); }
字典是一种非常方便的数据结构,它的检索速度非常快,而且不需要拆装箱,因此在C#中使用字典是非常常见的。
但是需要注意的是,字典的键是唯一的,如果添加重复的键,会抛出ArgumentException异常。
另外,字典的元素是无序的,如果需要有序的字典,可以使用SortedDictionary。
在理解字典的时候,需要有抽象其概念的思考,譬如可以把处理字符串之间相同元素这一任务看成是写入字典,然后读出字典的操作。