当前位置: 首页 > 工具软件 > TKey > 使用案例 >

C# 常用数据结构之字典Dictionary<TKey,TValue>

糜运良
2023-12-01

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

常用属性

Count

获取包含在 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

Keys

获得一个包含 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

Values

获得一个包含 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

常用方法

Add

将指定的键和值添加到字典中。

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

容量不够,会自动扩容。

Clear

将所有键和值从 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

ContainsKey

确定是否 Dictionary<TKey,TValue> 包含指定键。

Dictionary<string, int> testDict = new Dictionary<string, int> {
    {"张三", 99},
    {"李四", 95},
    {"王五", 98},
};
Console.WriteLine(testDict.ContainsKey("王五"));  // True
Console.WriteLine(testDict.ContainsKey("赵六"));  // False

ContainsValue

确定 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

Remove

将带有指定键的元素(键值对)从 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

TryGetValue

获取与指定键关联的值。

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

参考:

Dictionary<TKey,TValue> 类

C#-字典<TKey,TValue>

 类似资料: