涉及到两个问题:

一、访问磁盘中文件夹、文件夹下面的文件夹

先看一下磁盘文件夹结构

C盘下面有个根文件夹SaveFile,SaveFIle下面有两个子文件夹分别为,2018、2019,

子文件下2018下面有两个子文件夹18120和18131

子文件下2019下面有两个子文件夹18120和18129

现在希望把SaveFile子文件夹和子文件夹下面的文件夹的名称存起来,也就是下面这样的

2018       18120

       18131

2019  18120

     18129

二、基于以上的结构我们要怎么样存数据呢

其实我一开始自己也没绕出来的,最初想到的是使用Dictionary,键值对的方式存数据,但是一开始没想那么多,就一顿猛操作,发现有一个问题

不能存在相同键????突然有点懵逼,不知道咋写了,,,,此时又想到了用哈希表Hashtable

下面是Hashtable简单使用的方法

using System;
using System.Collections; namespace CollectionsApplication
{
class Program
{
static void Main(string[] args)
{
Hashtable ht = new Hashtable(); ht.Add("", "Zara Ali");
ht.Add("", "Abida Rehman");
ht.Add("", "Joe Holzner");
ht.Add("", "Mausam Benazir Nur");
ht.Add("", "M. Amlan");
ht.Add("", "M. Arif");
ht.Add("", "Ritesh Saikia"); if (ht.ContainsValue("Nuha Ali"))
{
Console.WriteLine("This student name is already in the list");
}
else
{
ht.Add("", "Nuha Ali");
}
// 获取键的集合
ICollection key = ht.Keys; foreach (string k in key)
{
Console.WriteLine(k + ": " + ht[k]);
}
Console.ReadKey();
}
}

Hashtable和Dictionary都存在一个问题不能存在相同键的问题,那我还是比较想使用Dictionary,接下来我们来尝试一下Dictionary完成吧,using Systemusing System.Collections;namespace CollectionsApplication{   class Program   {

    private const string SavePath = @"C:\SavaFile\";
public static List<string> YearStr = new List<string>() { };//存年份
//存年份和编号
public static Dictionary<string,List<string>> dic = new Dictionary<string,List<string>>() { };
static void Main(string[] args)
{
   #region
DirectoryInfo baseDir = new DirectoryInfo(SavePath);//读取C:\SavaFile\路径下的子目录
      DirectoryInfo[] dii = baseDir.GetDirectories();//存SaveFile文件夹子目录
foreach (var item in dii) { dic.Add(item.Name,null); YearStr.Add(item.Name);//将SaveFile文件夹添加到YearStr集合中
}
DirectoryInfo dir;
foreach (var item in YearStr)
{
dir = new DirectoryInfo(SavePath+@"\"+item);
          //存SaveFile文件夹子目录下的子目录
          DirectoryInfo[] diis = dir.GetDirectories();
List<string> Panlelst = new List<string>() { };//用来保存value
foreach (var item2 in diis)
{
if (dic.ContainsKey(item))//如果Dictionary中包含了某个键
{
Panlelst.Add(item2.Name);//值添加值集合中
dic[item] = Panlelst;//赋值到对应key中
}
}
}
//遍历字典
foreach (KeyValuePair<string, List<string>> kvp in dic)
{
foreach (var item in kvp.Value)
{
Console.WriteLine("Key = {0}, Value = {1}", kvp.Key, item);
}
}
Console.ReadLine();
#endregion
}
}

ok,我尝试成功啦,

输出结果看一下

再贴一些dictionary的一些常见用法吧,温故知新

 static void Main(string[] args)
{
//创建泛型哈希表,Key类型为int,Value类型为string
Dictionary<int, string> myDictionary = new Dictionary<int, string>();
//1.添加元素
myDictionary.Add(, "a");
myDictionary.Add(, "b");
myDictionary.Add(, "c");
//2.删除元素
myDictionary.Remove();
//3.假如不存在元素则添加元素
if (!myDictionary.ContainsKey())
{
myDictionary.Add(, "d");
}
//4.显示容量和元素个数
Console.WriteLine("元素个数:{0}",myDictionary.Count);
//5.通过key查找元素
if (myDictionary.ContainsKey())
{
Console.WriteLine("key:{0},value:{1}","", myDictionary[]);
Console.WriteLine(myDictionary[]);
}
//6.通过KeyValuePair遍历元素
foreach (KeyValuePair<int,string>kvp in myDictionary)
{
Console.WriteLine("key={0},value={1}", kvp.Key, kvp.Value); }
//7.得到哈希表键的集合
Dictionary<int, string>.KeyCollection keyCol = myDictionary.Keys;
//遍历键的集合
foreach (int n in keyCol)
{
Console.WriteLine("key={0}", n);
}
//8.得到哈希表值的集合
Dictionary<int, string>.ValueCollection valCol = myDictionary.Values;
//遍历值的集合
foreach( string s in valCol)
{
Console.WriteLine("value:{0}",s);
}
//9.使用TryGetValue方法获取指定键对应的值
string slove = string.Empty;
if (myDictionary.TryGetValue(, out slove))
{
Console.WriteLine("查找结果:{0}", slove);
}
else
{
Console.WriteLine("查找失败");
}
//10.清空哈希表
//myDictionary.Clear();
Console.ReadKey();
}

  1.HashTable

  哈希表(HashTable)表示键/值对的集合。在.NET Framework中,Hashtable是System.Collections命名空间提供的一个容器,用于处理和表现类似key-value的键值对,其中key通常可用来快速查找,同时key是区分大小写;value用于存储对应于key的值。Hashtable中key-value键值对均为object类型,所以Hashtable可以支持任何类型的keyvalue键值对,任何非 null 对象都可以用作键或值。

  在哈希表中添加一个key/键值对:HashtableObject.Add(key,); 

  在哈希表中去除某个key/键值对:HashtableObject.Remove(key);

  从哈希表中移除所有元素: HashtableObject.Clear();

  判断哈希表是否包含特定键key: HashtableObject.Contains(key);

  2.Dictionary

  Dictionary表示键和值的集合。

  Dictionary<string, string>是一个泛型

  他本身有集合的功能有时候可以把它看成数组

  他的结构是这样的:Dictionary<[key], [value]>

  他的特点是存入对象是需要与[key]值一一对应的存入该泛型

  通过某一个一定的[key]去找到对应的值

  3.HashTable和Dictionary的区别:

  (1).HashTable不支持泛型,而Dictionary支持泛型。

  (2). Hashtable 的元素属于 Object 类型,所以在存储或检索值类型时通常发生装箱和拆箱的操作,所以你可能需要进行一些类型转换的操作,而且对于int,float这些值类型还需要进行装箱等操作,非常耗时。

  (3).单线程程序中推荐使用 Dictionary, 有泛型优势, 且读取速度较快, 容量利用更充分。多线程程序中推荐使用 Hashtable, 默认的 Hashtable 允许单线程写入, 多线程读取, 对 Hashtable 进一步调用 Synchronized() 方法可以获得完全线程安全的类型. 而 Dictionary 非线程安全, 必须人为使用 lock 语句进行保护, 效率大减。

  (4)在通过代码测试的时候发现key是整数型Dictionary的效率比Hashtable快,如果key是字符串型,Dictionary的效率没有Hashtable快。

ok,今天的分享就到这里啦,有问题欢迎指出。

C# 存储相同键多个值的Dictionary的更多相关文章

  1. map集合键值对存储,键值不重复,值可以重复

    import java.util.HashMap; import java.util.Hashtable; import java.util.Iterator; import java.util.Li ...

  2. 键值对Dictionary、KeyValuePair、Hashtable 简单使用。

    KeyValuePair是单个的键值对对象.KeyValuePair可用于接收combox选定的值. 例如:KeyValuePair<string, object> par = (KeyV ...

  3. 【Java基础】ConcurrentHashMap为什么不能存null键和null值

    代码如下 /** * 测试ConcurrentHashMap null键和null值的问题 * @return */ @RequestMapping(value = "/get_nacos& ...

  4. PHP合并2个数字键数组的值

    先要了解一个基础知识点:PHP数组合并+与array_merge的区别分析 & 对多个数组合并去重技巧 <?php /** * PHP合并2个数字键数组的值 * * @param arr ...

  5. 存储数据键和项目对的类(Dictionary对象)

    存储数据键和项目对的类(Dictionary对象) <% Class Dictionary Public Copyright, Developer, Name, Version, Web Pri ...

  6. php--------合并2个数字键数组的值

    开发中遇到了,数组合并并去除重复这个功能,查阅资料, 找到了一个方法,分享一下. <?php /** * PHP合并2个数字键数组的值 * * @param array $arr1 * @par ...

  7. python中字典,没键加键,有键操作其键对应的值,的思想

    cars = ['鲁A32444', '鲁B12333', '京B8989M', '黑C49678', '黑C46555', '沪B25041', '黑C34567'] locations = {'沪 ...

  8. 【JSP EL】<c:if> <c:foreach >EL表达式 获取list长度/不用循环,EL在List中直接获取第一项的内容/EL获取Map的键,Map的值

    1.EL表达式 获取list长度 <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" ...

  9. (原)未能启用约束。一行或多行中包含违反非空、唯一或外键约束的值与DATEADD

    SQLServer2014,查询分析器中 这样的脚本是没有问题的:AND TPO.CREATEON <= DATEADD(DAY, 1, '2017/3/3 0:00:00') 但.NET  D ...

随机推荐

  1. T-shirt

    题目描述 JSZKC is going to spend his vacation!  His vacation has N days. Each day, he can choose a T-shi ...

  2. Python的range(n)的用法

    Python的range(n) 方法就是: API定义: If you do need to iterate(迭代) over a sequence(一系列) of numbers, the buil ...

  3. BucketSort(桶排序)原理及C++代码实现

    桶排序假设输入数据服从均匀分布,平均情况下它的时间复杂度为O(n). 桶排序将输入数据的区间均匀分成若干份,每一份称作“桶”.分别对每一个桶的内容进行排序,再按桶的顺序输出则完成排序. 通常使用链表来 ...

  4. 常见的Java不规范代码

    1.格式化源代码 Ctrl + Shift + F – 格式化源代码. Ctrl + Shift + O – 管理import语句并移除未使用的语句 除了手动执行这两个功能外,你还可以让Eclipse ...

  5. [LC] 53. Maximum Subarray

    Given an integer array nums, find the contiguous subarray (containing at least one number) which has ...

  6. OpenAL介绍

    OpenAL(Open Audio Library)是自由软件界的跨平台音效API,由Loki Software,使用在Windows.Linux 系统上,用在音效缓冲和收听中编码. OpenAL设计 ...

  7. 对Java8新的日期时间类的学习(二)

    示例11 在Java中如何判断某个日期是在另一个日期的前面还是后面 这也是实际项目中常见的一个任务.你怎么判断某个日期是在另一个日期的前面还是后面,或者正好相等呢?在Java 8中,LocalDate ...

  8. leaflet加载各种地图

    Leaflet调用各种地图的功能十分复杂,幸好有leaflet.ChineseTmsProviders这个插件,这四种地图直接就可以加载进来,十分方便. 下面是我做的例子: <!DOCTYPE ...

  9. [LC] 240. Search a 2D Matrix II

    Write an efficient algorithm that searches for a value in an m x n matrix. This matrix has the follo ...

  10. JAVA数据结构——单链表

    链表:一. 顺序存储结构虽然是一种很有用的存储结构,但是他有如下几点局限性:1. 因为创造线性表的时候已经固定了空间,所以当需要扩充空间时,就需要重新创建一个地址连续的更大的存储空间.并把原有的数据元 ...