C# Dictionary存储相同键多值解决方法与示例

1星 8 下载量 181 浏览量 更新于2024-09-09 收藏 94KB PDF 举报
"C#存储相同键多个值的Dictionary实例详解" 在C#编程语言中,`Dictionary<TKey, TValue>` 是一个常用的容器,用于存储键值对。然而,它的一个核心特性是每个键都是唯一的,这意味着你不能在同一个字典中添加具有相同键的多个条目。当你需要存储相同键的多个值时,需要采用一些策略来解决这个问题。以下是对这个问题的详细探讨和解决方案。 首先,我们来看一下问题背景:你需要存储磁盘上特定文件夹结构的路径,这种结构包括根目录以及其子目录的名称。在这种情况下,每个目录名都可以被视为一个键,而每个键可能对应多个子目录名作为值。传统的`Dictionary<TKey, TValue>` 将无法满足这个需求,因为它不允许重复键。 在C#中,有几种方法可以处理这种情况: 1. **使用List<T>作为值**:你可以将字典的值类型设置为`List<string>`,这样每个键就可以关联一个包含多个值(即子目录名)的列表。当添加新值时,检查键是否存在,如果存在,则将新值添加到对应的列表中;如果不存在,则创建一个新的列表并添加键值对。 ```csharp Dictionary<string, List<string>> dirStructure = new Dictionary<string, List<string>>(); // 添加值 if (!dirStructure.ContainsKey("2018")) { dirStructure["2018"] = new List<string>(); } dirStructure["2018"].Add("18120"); ``` 2. **自定义集合类**:创建一个自定义的集合类,继承自`CollectionBase`或`List<T>`,并在其中重写`Add`方法,使其能够处理相同的键。这将允许你在添加元素时保持键的唯一性,同时将所有值存储在一个集合中。 3. **使用`Lookup<TKey, TElement>`**:`System.Linq.Lookup<TKey, TElement>` 类型提供了类似于字典的功能,但允许一个键对应多个值。它是通过`GroupBy` LINQ 方法创建的,适合于这种场景。 4. **使用`Hashtable`**:虽然`Hashtable` 是.NET Framework早期版本中的一个非泛型集合,但它允许键重复。在上述示例中,如果你选择使用`Hashtable`,则可以轻松地存储相同键的多个值。 ```csharp Hashtable ht = new Hashtable(); ht.Add("2018", "18120"); ht.Add("2018", "18131"); // 这将覆盖之前的值 ``` 但是,`Hashtable` 不推荐在现代C#代码中使用,因为它不支持泛型,可能导致类型安全问题和效率较低。 根据你的需求,你可以选择最适合的解决方案。如果选择使用`Dictionary<TKey, TValue>` 结合`List<T>`,确保在处理文件夹结构时,正确地添加和管理每个键的值列表,以便有效地存储和检索磁盘上的目录结构。