6.2 Dictionary 详细讲解
Dictionary<TKey, TValue>
是 C# 中非常常用的一种集合类型,它允许您存储键值对(key-value pairs),并且可以通过键快速查找对应的值。下面是对 Dictionary
的详细讲解,包括其优点、缺点以及代码示例。
优点
- 快速查找:
Dictionary
使用哈希表实现,因此查找、插入和删除操作的平均时间复杂度为 O(1)。 - 键值对存储:可以方便地存储和检索键值对,适用于需要快速查找的场景。
- 灵活性:键和值可以是任何数据类型,包括自定义类型。
- 动态大小:
Dictionary
的大小可以根据需要动态调整,无需预先指定容量。
缺点
- 无序性:
Dictionary
中的元素没有固定的顺序,遍历元素时顺序可能与插入顺序不同。 - 内存消耗:由于使用哈希表实现,
Dictionary
可能会消耗较多的内存。 - 线程不安全:
Dictionary
不是线程安全的,如果在多线程环境中使用,需要额外的同步机制。 - 哈希冲突:虽然哈希表设计得当可以减少哈希冲突,但在某些情况下仍可能出现冲突,影响性能。
代码示例
以下是一些使用 Dictionary
的示例代码,展示了如何声明、初始化、添加、查找和删除元素。
1. 声明和初始化
csharp
using System;
using System.Collections.Generic;
class Program
{
static void Main()
{
// 声明一个 Dictionary,键为 string 类型,值为 int 类型
Dictionary<string, int> ageDictionary = new Dictionary<string, int>();
// 初始化时添加键值对
Dictionary<string, string> cityDictionary = new Dictionary<string, string>
{
{ "Alice", "New York" },
{ "Bob", "Los Angeles" },
{ "Charlie", "Chicago" }
};
}
}
2. 添加元素
csharp
using System;
using System.Collections.Generic;
class Program
{
static void Main()
{
Dictionary<string, int> ageDictionary = new Dictionary<string, int>();
// 添加键值对
ageDictionary.Add("Alice", 30);
ageDictionary.Add("Bob", 25);
ageDictionary.Add("Charlie", 35);
// 输出所有键值对
foreach (var kvp in ageDictionary)
{
Console.WriteLine($"Name: {kvp.Key}, Age: {kvp.Value}");
}
}
}
3. 查找元素
csharp
using System;
using System.Collections.Generic;
class Program
{
static void Main()
{
Dictionary<string, int> ageDictionary = new Dictionary<string, int>
{
{ "Alice", 30 },
{ "Bob", 25 },
{ "Charlie", 35 }
};
// 使用 TryGetValue 方法查找元素
if (ageDictionary.TryGetValue("Alice", out int age))
{
Console.WriteLine($"Alice's age is {age}.");
}
else
{
Console.WriteLine("Alice not found.");
}
// 使用索引器查找元素
if (ageDictionary.ContainsKey("Bob"))
{
Console.WriteLine($"Bob's age is {ageDictionary["Bob"]}.");
}
else
{
Console.WriteLine("Bob not found.");
}
}
}
4. 删除元素
csharp
using System;
using System.Collections.Generic;
class Program
{
static void Main()
{
Dictionary<string, int> ageDictionary = new Dictionary<string, int>
{
{ "Alice", 30 },
{ "Bob", 25 },
{ "Charlie", 35 }
};
// 删除键为 "Bob" 的元素
if (ageDictionary.Remove("Bob"))
{
Console.WriteLine("Bob removed.");
}
else
{
Console.WriteLine("Bob not found.");
}
// 输出剩余的键值对
foreach (var kvp in ageDictionary)
{
Console.WriteLine($"Name: {kvp.Key}, Age: {kvp.Value}");
}
}
}
通过这些示例,您可以更好地理解和使用 Dictionary
集合类型。