【c# .net】字典(Dictionary)
字典(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;