C# Dictionary存储多值解决方法与文件夹遍历示例

2 下载量 125 浏览量 更新于2024-08-29 收藏 92KB PDF 举报
"这篇资源主要讨论了如何在C#中使用字典(Dictionary)存储具有相同键的多个值,以及在处理文件系统目录结构时遇到的问题。文章首先介绍了磁盘上的一个文件夹结构,其中包含多级子文件夹,并提出了需要存储这些文件夹名称的需求。然后,作者提到了尝试使用Dictionary存储数据时遇到的问题,即Dictionary不允许有相同的键。最后,作者转向了另一种数据结构——哈希表(Hashtable),作为可能的解决方案,并提供了简单的Hashtable使用示例代码。" 在C#中,`Dictionary<TKey, TValue>` 是一个键值对集合,其中每个键都是唯一的。这意味着如果你试图向Dictionary中添加一个已存在的键,原有的键值对将被新值替换,而不是添加一个新的值。这对于需要存储相同键不同值的情况是不适用的。 在处理文件系统结构时,如果需要存储类似"2018 - 18120, 18131"这样的数据,一个键对应多个值的映射关系,可以考虑使用以下几种方法: 1. List<T> 作为值:使用Dictionary,但将值类型设置为List<T>,这样每个键都可以关联一个列表,列表中存储所有与该键相关的值。例如,`Dictionary<string, List<string>>`,键可以是年份,值是对应的月份列表。 ```csharp Dictionary<string, List<string>> folderStructure = new Dictionary<string, List<string>>(); folderStructure.Add("2018", new List<string> { "18120", "18131" }); folderStructure.Add("2019", new List<string> { "18120", "18129" }); ``` 2. 自定义类作为值:创建一个自定义类来封装一组相关值,然后使用这个类作为Dictionary的值类型。这适用于更复杂的数据结构,不仅仅是简单的字符串列表。 ```csharp class FolderDetails { public string Year { get; set; } public List<string> Months { get; set; } } Dictionary<string, FolderDetails> folderDetailsDict = new Dictionary<string, FolderDetails>(); folderDetailsDict.Add("2018", new FolderDetails { Year = "2018", Months = new List<string> { "18120", "18131" } }); folderDetailsDict.Add("2019", new FolderDetails { Year = "2019", Months = new List<string> { "18120", "18129" } }); ``` 3. 使用 `HashSet<T>` 或 `LinkedList<T>` :对于不需要保持插入顺序的情况,HashSet<T>可以避免重复值;对于需要保持插入顺序的情况,LinkedList<T>是一个不错的选择。 4. 哈希表(Hashtable):如同文中提到的,当需要支持多个值与同一个键关联时,可以考虑使用`Hashtable`,它允许相同的键出现多次。然而,`Hashtable`是非泛型的,使用起来不如`Dictionary<TKey, TValue>`方便且高效,但在某些旧的或兼容性的场景下可能会用到。 ```csharp Hashtable folderHashtable = new Hashtable(); folderHashtable.Add("2018", new ArrayList { "18120", "18131" }); folderHashtable.Add("2019", new ArrayList { "18120", "18129" }); ``` 在处理文件系统操作时,可以使用`System.IO`命名空间下的类,如`DirectoryInfo`和`FileInfo`来遍历文件夹和文件。例如,以下代码可以遍历指定路径下的所有子目录: ```csharp string rootPath = @"C:\SaveFile"; foreach (var directory in new DirectoryInfo(rootPath).GetDirectories()) { Console.WriteLine(directory.Name); foreach (var subDirectory in directory.GetDirectories()) { Console.WriteLine("\t" + subDirectory.Name); } } ``` 根据实际情况选择合适的数据结构,可以有效地组织和管理这些文件夹信息。在C#中,通常推荐使用泛型的`Dictionary<TKey, TValue>`或`List<T>`,因为它们更强大,更易于理解和维护。