尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

C# 字典(Dictionary)完全指南:从基础到高级应用

C# 字典(Dictionary)完全指南:从基础到高级应用 1. 什么是 C# 字典字典Dictionary是 C# 中最常用的集合类型之一它表示键值对的集合其中每个键必须是唯一的。字典基于哈希表实现提供了快速的查找、插入和删除操作。2. 字典的基本用法2.1 创建和初始化字典以下是创建字典的几种常用方式// 方式1使用构造函数 Dictionarystring, int scores new Dictionarystring, int(); // 方式2使用集合初始化器 Dictionarystring, string capitals new Dictionarystring, string { { China, Beijing }, { USA, Washington D.C. }, { Japan, Tokyo } }; // 方式3使用索引初始化器C# 6.0 Dictionarystring, int ages new Dictionarystring, int { [Alice] 25, [Bob] 30, [Charlie] 35 };2.2 添加和访问元素// 添加元素 Dictionarystring, int inventory new Dictionarystring, int(); inventory.Add(Apples, 50); inventory[Oranges] 30; // 使用索引器添加或修改 // 访问元素 int appleCount inventory[Apples]; // 直接访问 Console.WriteLine($苹果数量{appleCount}); // 安全访问避免 KeyNotFoundException if (inventory.TryGetValue(Bananas, out int bananaCount)) { Console.WriteLine($香蕉数量{bananaCount}); } else { Console.WriteLine(未找到香蕉); }2.3 更新和删除元素// 更新元素 inventory[Apples] 60; // 直接赋值更新 // 删除元素 inventory.Remove(Oranges); // 删除指定键 inventory.Clear(); // 清空所有元素3. 字典的常用属性和方法属性/方法说明示例Count获取字典中键值对的数量int count inventory.Count;Keys获取包含所有键的集合foreach (string key in inventory.Keys)Values获取包含所有值的集合foreach (int value in inventory.Values)ContainsKey检查是否包含指定键bool hasKey inventory.ContainsKey(Apples);ContainsValue检查是否包含指定值bool hasValue inventory.ContainsValue(50);TryAdd尝试添加键值对.NET Core 2.0bool added inventory.TryAdd(Pears, 40);4. 遍历字典4.1 使用 foreach 循环// 遍历所有键值对 foreach (KeyValuePairstring, int item in inventory) { Console.WriteLine(${item.Key}: {item.Value}); } // 只遍历键 foreach (string key in inventory.Keys) { Console.WriteLine($键{key}); } // 只遍历值 foreach (int value in inventory.Values) { Console.WriteLine($值{value}); }4.2 使用 LINQ 查询// 筛选值大于 20 的项 var filtered inventory.Where(kvp kvp.Value 20); // 按值排序 var sorted inventory.OrderBy(kvp kvp.Value); // 转换为其他集合 Liststring keysList inventory.Keys.ToList(); int[] valuesArray inventory.Values.ToArray();5. 字典的高级特性5.1 自定义键的相等比较器// 创建不区分大小写的字符串键字典 Dictionarystring, int caseInsensitiveDict new Dictionarystring, int( StringComparer.OrdinalIgnoreCase ); caseInsensitiveDict[Apple] 10; int value caseInsensitiveDict[APPLE]; // 可以找到值为 105.2 线程安全的字典ConcurrentDictionaryusing System.Collections.Concurrent; ConcurrentDictionarystring, int concurrentDict new ConcurrentDictionarystring, int(); // 线程安全的添加和更新 concurrentDict.TryAdd(Item1, 100); concurrentDict.AddOrUpdate(Item1, 200, (key, oldValue) oldValue 50);5.3 只读字典IReadOnlyDictionaryIReadOnlyDictionarystring, int readOnlyDict inventory; // 只能读取不能修改 int count readOnlyDict.Count; bool exists readOnlyDict.ContainsKey(Apples);6. 性能考虑和最佳实践选择合适的键类型键类型应正确实现GetHashCode()和Equals()方法预估容量如果知道大致元素数量可以在构造函数中指定初始容量以提高性能避免频繁扩容字典在元素数量超过容量时会自动扩容这是一个相对昂贵的操作使用 TryGetValue 避免异常比直接使用索引器更安全且性能更好考虑使用 ConcurrentDictionary在多线程环境下需要线程安全的字典操作时7. 常见问题解答Q1字典和哈希表有什么区别DictionaryTKey, TValue是泛型类型安全的性能更好推荐使用。Hashtable是非泛型的存储 object 类型需要装箱拆箱性能较差。Q2字典的键可以是 null 吗取决于键类型的定义。对于引用类型默认情况下键可以为 null但自定义比较器可能会改变这一行为。Q3如何实现字典的深拷贝// 浅拷贝共享值引用 Dictionarystring, Listint original new Dictionarystring, Listint(); Dictionarystring, Listint shallowCopy new Dictionarystring, Listint(original); // 深拷贝需要复制值 Dictionarystring, Listint deepCopy original.ToDictionary( kvp kvp.Key, kvp new Listint(kvp.Value) );8. 总结C# 字典是处理键值对数据的强大工具具有优秀的查找性能和丰富的功能。掌握字典的基本操作、高级特性和最佳实践能够帮助你在实际开发中更高效地处理数据集合。
返回列表