C# Dictionary(字典)

Dictionary < TKey,TValue > 是一个泛型集合,它以不特定的顺序存储键值对。

字典特性

  • Dictionary<TKey, TValue> 存储键值对。

  • 属于System.Collection.Generic命名空间。

  • 实现 IDictionary <TKey,TValue>接口。

  • 键必须是唯一的,不能为null。

  • 值可以为null或重复。

  • 可以通过在索引器中传递相关键来访问值,例如 myDictionary[key]

  • 元素存储为 KeyValuePair <TKey,TValue> 对象。

创建字典

您可以通过传递Dictionary<TKey,TValue>对象来创建它可以存储的键和值的类型。下面的示例演示如何创建字典和添加键值对。

IDictionary<int, string> numberNames = new Dictionary<int, string>();
numberNames.Add(1,"One"); //使用Add()方法添加键/值
numberNames.Add(2,"Two");
numberNames.Add(3,"Three");

//以下引发运行时异常:key already added.。
//numberNames.Add(3, "Three"); 

foreach(KeyValuePair<int, string> kvp in numberNames)
    Console.WriteLine("Key: {0}, Value: {1}", kvp.Key, kvp.Value);
		
//使用collection-initializer语法创建字典
var cities = new Dictionary<string, string>(){
	{"UK", "London, Manchester, Birmingham"},
	{"USA", "Chicago, New York, Washington"},
	{"India", "Mumbai, New Delhi, Pune"}
};
		
foreach(var kvp in cities)
    Console.WriteLine("Key: {0}, Value: {1}", kvp.Key, kvp.Value);

在上面的示例中,numberNames 是 Dictionary<int,string>类型的字典,因此它可以存储int键和字符串值。同样,cities 是一个 Dictionary<string,string> 类型的字典,因此它可以存储字符串键和字符串值。字典不能包含重复键 或 null键,而值可以是重复键或null键。键必须是唯一的,否则将引发运行时异常。

访问字典元素

可以使用索引器访问字典。指定键以获取关联值。还可以使用 ElementAt()方法从指定的索引中获取 KeyValuePair 。

var cities = new Dictionary<string, string>(){
	{"UK", "London, Manchester, Birmingham"},
	{"USA", "Chicago, New York, Washington"},
	{"India", "Mumbai, New Delhi, Pune"}
};

Console.WriteLine(cities["UK"]); //打印 UK 键值
Console.WriteLine(cities["USA"]);//打印 USA 键值
//Console.WriteLine(cities["France"]); // 运行时异常:run-time exception: Key does not exist

//使用ContainsKey()检查未知键
if(cities.ContainsKey("France")){  
    Console.WriteLine(cities["France"]);
}

//使用TryGetValue()获取未知键的值
string result;

if(cities.TryGetValue("France", out result))
{
    Console.WriteLine(result);
}

//使用ElementAt()通过索引检索键值对
for (int i = 0; i < cities.Count; i++)
{
    Console.WriteLine("Key: {0}, Value: {1}", cities.ElementAt(i).Key, cities.ElementAt(i).Value);
}

更新字典

通过在索引器中指定键来更新键的值。如果字典中不存在键,它将抛出KeyNotFoundException,因此在访问未知键之前使用ContainsKey()方法

var cities = new Dictionary<string, string>(){
	{"UK", "London, Manchester, Birmingham"},
	{"USA", "Chicago, New York, Washington"},
	{"India", "Mumbai, New Delhi, Pune"}
};

cities["UK"] = "Liverpool, Bristol"; //更新 UK 键的值
cities["USA"] = "Los Angeles, Boston"; //更新 USA 键的值
//cities["France"] = "Paris"; //引发运行时异常:KeyNotFoundException

if(cities.ContainsKey("France")){
    cities["France"] = "Paris";
}

删除字典中的元素

Remove()方法从字典中删除现有的键值对。Clear()方法删除字典中的所有元素。

var cities = new Dictionary<string, string>(){
	{"UK", "London, Manchester, Birmingham"},
	{"USA", "Chicago, New York, Washington"},
	{"India", "Mumbai, New Delhi, Pune"}
};

cities.Remove("UK"); // 删除 UK 
//cities.Remove("France"); //引发运行时异常:KeyNotFoundException

if(cities.ContainsKey("France")){ // 取出键之前先检查一下
    cities.Remove("France");
}

cities.Clear(); //删除所有元素

字典类层次结构

下图说明了泛型Dictionary类的层次结构。

泛型字典C#

可在docs.microsoft.com上了解字典方法和属性。