【c# .net】字典(Dictionary)

2 年前 · 来自专栏 c# ( csharp ) .NET资料

字典(Dictionary)

1.简介

Dictionary<Tkey, Tvalue> 泛型类提供一组键到一组值的映射。每次对字典的添加都包含一个值和与其关联的键。使用其键检索值的速度非常快,接近 O (1) ,因为该类是作为哈希表实现的。

Dictionary 和 hashtable 用法有点相似,他们都是基于键值对的数据集合,但实际上他们内部的实现原理有很大的差异。

区别:

1)Dictionary 支持泛型,而 Hashtable 不支持。

2)Dictionary 没有装填因子(Load Facto)概念,当容量不够时才扩容(扩容跟 Hashtable一样,也是两倍于当前容量最小素数),Hashtable 是“已装载元素”与 ”bucket 数组长度“ 大于装载因子时扩容。

3)Dictionary 内部的存储 value 的数组按先后插入的顺序排序,Hashtable 不是。

4)当不发生碰撞时,查找 Dictionary 需要进行两次索引定位,Hashtable 需一次。


2.特性介绍

1) key(键) 是 唯一 的, 不可重复 ,同时 key 区分大小写

2) 只能通过 key(键) 查询对应 的 value(值) ,同时 不能在指定位置插入元素,且不带排序功能。

3) key(键) 不能为 null ,但 value(值) 可以

4) 容量 是字典最大包含的元素数,会根据元素增减而 动态调整容量


Dictionary<TKey,TValue> 类的方法和属性

1)下表列出了 Dictionary<TKey,TValue> 类的一些常用的 属性 :

属性 描述
IComparer Comparer { get; } 获取元素的排序类型
int Count { get; } 获取键/值对的数目
TValue item[TKey key] { get; set; } 获取或设置指定键的值
KeyCollection Keys { get; } 获取键的集合
ValueCollection Values { get; } 获取值的集合

2)下表列出了 Dictionary<TKey,TValue> 类的一些常用的 方法

方法 描述
void Add (TKey key, TValue value); 添加指定键值对元素
bool ContainsKey (TKey key); 判断是否包含指定键
bool ContainsValue (TValue value); 判断是否包含指定值
bool Remove (TKey key); 移除包含指定键的元素并返回布尔值表示执行情况
bool TryGetValue (TKey key, out TValue value); 判断是否包含指定键,如果有,返回它的值
void Clear (); 移除所有元素

代码演示

注意:为了方便阅读,以下将代码拆分为多段进行演示,实际运行可以把代码直接拼接起来

using System;
using System.Collections;
using System.Collections.Generic;
namespace DictionaryTest
    class Program
        static void Main(string[] args)
            DictionaryTest();
            Console.ReadKey();
        //封装两个简单的方法方便下方进行验证
        /// <summary>
        /// 华丽的分隔线
        /// </summary>
        static void 分隔线()
            Console.WriteLine("\n ------------------------------------------- \n");
        /// <summary>
        /// 遍历 Dictionary 中的所有元素
        /// </summary>
        static void FDictionary<K,V>(Dictionary<K,V> dictionary)
            Console.WriteLine(" 元素:");
            foreach (var item in dictionary)
                Console.WriteLine(" Key = {0}, Value = {1}", item.Key, item.Value);
            分隔线();
        static void DictionaryTest()
            //new 时必须为泛型,可以指定容量,可以指定比较器
            Dictionary<int, string> dictionary = new Dictionary<int, string>();
            dictionary.Add(9, "九");
            dictionary.Add(8, "八");
            dictionary.Add(7, "七");
            dictionary.Add(6, "六");
            dictionary.Add(1, "一");
            dictionary.Add(5, "五");
            dictionary.Add(3, "三");
            dictionary.Add(2, "二");
            Console.WriteLine("\n 遍历字典: ");
            FDictionary(dictionary);
            Console.WriteLine("\n 获取元素的排序类型: \n {0}", dictionary.Comparer);
            //Count 指的是字典的实际元素个数而不是指容量
            Console.WriteLine("\n 获取键/值对的数目: \n {0}", dictionary.Count);
            //item 可以为 key 赋值,如果已经赋值过,则修改它的值,如果 key 不存在则会报错
            Console.WriteLine("\n 获取或设置指定键的值: \n item[6]:{0}", dictionary[6]);
            Console.WriteLine("\n 获取键的集合: Keys   ");
            foreach (var item in dictionary.Keys) Console.Write(" " + item);
            分隔线();
            Console.WriteLine("\n 获取值的集合: Values ");
            foreach (var item in dictionary.Values) Console.Write(" " + item);
            分隔线();

运行结果:

            Console.WriteLine("\n 1.添加指定键值对元素: 10, 十\n");
            //无法添加相同Key的元素,运行时会报错
            //dictionary.Add(2, "二");
            dictionary.Add(10, "十");
            FDictionary(dictionary);
            Console.WriteLine("\n 2.判断是否包含指定键: 8:{0}\n", dictionary.ContainsKey(8));
            分隔线();
            Console.WriteLine("\n 3.判断是否包含指定值: 八:{0}\n", dictionary.ContainsValue("八"));
            分隔线();

运行结果:

            Console.WriteLine("\n 4.移除元素并返回布尔值: 10:{0}\n", dictionary.Remove(10));
            FDictionary(dictionary);
            Console.WriteLine("\n 5.判断是否包含指定键,如果有,返回它的值: \n");
            //如果没有该键,则返回该类型的默认值,不会报错
            string values;