涉及到两个问题:

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

先看一下磁盘文件夹结构

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. Image.FromStream(ms) 提示参数无效

    说明ms有问题,首先确保有读到数据,这种情况是保存到库的时候出错的. 原来你可能是这样写的: MemoryStream stream = new MemoryStream();PictureBox1. ...

  2. IDEA Maven项目中添加tomcat没有无artifact选项

    IntelliJ使用 ##使用IntelliJ IDEA配置web项目时,选择Edit Configration部署Tomcat的Deployment可能会出现以下情况: 导致新手部署过程中摸不着头脑 ...

  3. 关于MyBatis的运行原理(转载)

    1.获取sqlSessionFactory对象: 解析文件的每一个信息保存在Configuration中,返回包含Configuration的DefaultSqlSessionFactory: 注意: ...

  4. OpenCV 特征点检测

    #include <stdio.h> #include <iostream> #include "opencv2/core/core.hpp" #inclu ...

  5. 线程同步Lock锁

    Lock接口历史 java1.5版本之前只有synchronized一种锁,lock是java1.5版本之后提供的接口.lock接口与synchronized接口功能相同,但是需要手动获取锁和释放锁. ...

  6. python循环删除list中的元素

    直接上例子: a = [1,2,3,4,5,6] for i in a: a.remove(i) print(a) 返回:[2, 4, 6] 循环a,想删除a的所有元素,但实际确有数据保留了下来,这是 ...

  7. 性能分析之工具使用——cpu、io 、mem【工具分析】

    nmon nmon 是一种在aix 与各种 Linux 操作系统上广泛使 用的监控与与分析工具,他主要记录以下内容: • cpu 占用率 • 内存使用情况 • 磁盘I/O 速度.传输和读写比率 • 文 ...

  8. 洛谷 P1220 关路灯 题解

    Description 有 $n$ 盏路灯,每盏路灯有坐标(单位 $m$)和功率(单位 $J$).从第 $c$ 盏路灯开始,可以向左或向右关闭路灯.速度是 $1m/s$.求所有路灯的最少耗电.输入保证 ...

  9. EMP平台简介(转载)

    1.什么是EMP EMP平台是一个基于J2EE体系的.WEB应用的.基础框架平台: 表现逻辑框架(MVCFrameWork)与业务逻辑框架(EMPBizLogic)分离: 组件化.配置化设计技术: 可 ...

  10. Java WebSocket实现简易聊天室

    一.Socket简介 Socket又称"套接字",应用程序通常通过"套接字"向网络发出请求或者应答网络请求.Socket的英文原义是“孔”或“插座”,作为UNI ...