Dictionary<TKey,TValue> 是 C# 中使用非常频繁的一种数据结构,我们通常称之为“字典”!其中每个元素都是由键值对(Key-Value)组成!
命名空间:System.Collections.Generic
1、键值对中的键和值都可以是任何类型的(泛型),但是键必须唯一且不能为 null,而值可以不唯一;
2、增删改查速度快,查找一个值的时间复杂度接近 O(1);
3、长度不固定,动态扩容;
4、比较消耗内存(以空间换时间);
1、Dictionary<TKey,TValue>()
初始化 Dictionary<TKey,TValue> 类的新实例,该实例为空,具有默认的初始容量并为键类型使用默认的相等比较器。
Dictionary<int, string> testDict = new Dictionary<int, string>();
testDict.Add(1, "a");
testDict.Add(2, "b");
testDict.Add(3, "c");
foreach (KeyValuePair<int, string> element in testDict)
{
Console.WriteLine("{0} {1}", element.Key, element.Value);
}
/*
1 a
2 b
3 c
*/
2、Dictionary<TKey,TValue>(Int32)
初始化 Dictionary<TKey,TValue> 类的新实例,该实例为空,具有指定的初始容量并为键类型使用默认的相等比较器。
Dictionary<string, string> testDict = new Dictionary<string, string>(10);
testDict.Add("name", "fightsyj");
testDict.Add("id", "123123");
testDict.Add("score", "100");
foreach (KeyValuePair<string, string> kvp in testDict)
{
Console.WriteLine("{0} {1}", kvp.Key, kvp.Value);
}
/*
name fightsyj
id 123123
score 100
*/
ps
如果 Dictionary<TKey,TValue> 的大小是可以估算的,最好在初始化的时候指定容量,这样可以在添加元素的时候避免无意义的动态扩容,提高性能!
3、当然,我们最常用的初始化方式应该是:使用集合初始值设定项初始化字典
Dictionary<string, string> testDict = new Dictionary<string, string> {
{"name", "fightsyj"},
{"id", "123123"},
{"score", "100"}
};
foreach (KeyValuePair<string, string> kvp in testDict)
{
Console.WriteLine("{0} {1}", kvp.Key, kvp.Value);
}
/*
name fightsyj
id 123123
score 100
*/
或者:
Dictionary<string, string> testDict = new Dictionary<string, string> {
["name"] = "fightsyj",
["id"] = "123123",
["score"] = "100"
};
foreach (KeyValuePair<string, string> kvp in testDict)
{
Console.WriteLine("{0} {1}", kvp.Key, kvp.Value);
}
/*
name fightsyj
id 123123
score 100
*/
获取包含在 Dictionary<TKey,TValue> 中的键/值对的数目。
Dictionary<int, string> testDict = new Dictionary<int, string> {
[1] = "one",
[2] = "two",
[3] = "three"
};
Console.WriteLine("testDict 中元素(键值对)的数量为:{0}", testDict.Count);
// testDict 中元素(键值对)的数量为:3
获得一个包含 Dictionary<TKey,TValue> 中的键的集合。
Dictionary<int, string> testDict = new Dictionary<int, string> {
[1] = "one",
[2] = "two",
[3] = "three"
};
foreach (object key in testDict.Keys)
{
Console.Write(key + " ");
}
// 1 2 3
获得一个包含 Dictionary<TKey,TValue> 中的值的集合。
Dictionary<int, string> testDict = new Dictionary<int, string> {
[1] = "one",
[2] = "two",
[3] = "three"
};
foreach (object value in testDict.Values)
{
Console.Write(value + " ");
}
// one two three
将指定的键和值添加到字典中。
Dictionary<string, int> testDict = new Dictionary<string, int>(5);
testDict.Add("张三", 99);
testDict.Add("李四", 95);
testDict.Add("王五", 98);
foreach (KeyValuePair<string, int> kvp in testDict)
{
Console.WriteLine("{0} {1}", kvp.Key, kvp.Value);
}
/*
张三 99
李四 95
王五 98
*/
ps
容量不够,会自动扩容。
将所有键和值从 Dictionary<TKey,TValue> 中移除,即清空字典。
Dictionary<string, int> testDict = new Dictionary<string, int> {
["张三"] = 99,
["李四"] = 95,
["王五"] = 98
};
Console.WriteLine("当前键值对数量为:{0}", testDict.Count); // 当前键值对数量为:3
testDict.Clear();
Console.WriteLine("当前键值对数量为:{0}", testDict.Count); // 当前键值对数量为:0
确定是否 Dictionary<TKey,TValue> 包含指定键。
Dictionary<string, int> testDict = new Dictionary<string, int> {
{"张三", 99},
{"李四", 95},
{"王五", 98},
};
Console.WriteLine(testDict.ContainsKey("王五")); // True
Console.WriteLine(testDict.ContainsKey("赵六")); // False
确定 Dictionary<TKey,TValue> 是否包含特定值。
Dictionary<string, int> testDict = new Dictionary<string, int> {
{"张三", 99},
{"李四", 95},
{"王五", 98},
};
Console.WriteLine(testDict.ContainsValue(99)); // True
Console.WriteLine(testDict.ContainsValue(100)); // False
将带有指定键的元素(键值对)从 Dictionary<TKey,TValue> 中移除。
Dictionary<string, string> testDict = new Dictionary<string, string> {
["name"] = "fightsyj",
["sex"] = "male",
["age"] = "guess"
};
testDict.Remove("sex");
foreach (KeyValuePair<string, string> kvp in testDict)
{
Console.WriteLine("{0} {1}", kvp.Key, kvp.Value);
}
// name fightsyj
// age guess
Console.WriteLine("当前键值对数量为:{0}", testDict.Count); // 当前键值对数量为:2
获取与指定键关联的值。
Dictionary<string, string> testDict = new Dictionary<string, string> {
["name"] = "fightsyj",
["sex"] = "male",
["age"] = "guess"
};
string value = "";
bool ret = testDict.TryGetValue("name", out value); // 存在:true 不存在:false
Console.WriteLine("以 name 为键的键值对 {0},对应的值为:{1}", ret ? "存在" : "不存在", value);
// 以 name 为键的键值对 存在,对应的值为:fightsyj
参考: