C#的字典(Dictionary)

澜莓

参考资料

字典的定义

字典和哈希表相似,是一系列键值对的集合,它的定义(构造器)是:

                // 初始化一个空字典
                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)

字典元素(KeyValuePair<TKey, TValue>)

关于字典还有一些比较神奇的功能。我们可以单独获取字典的键或者值的集合。

                // 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。

在理解字典的时候,需要有抽象其概念的思考,譬如可以把处理字符串之间相同元素这一任务看成是写入字典,然后读出字典的操作。