C# 存储相同键多个值的Dictionary
涉及到两个问题:
一、访问磁盘中文件夹、文件夹下面的文件夹
先看一下磁盘文件夹结构
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的更多相关文章
- map集合键值对存储,键值不重复,值可以重复
import java.util.HashMap; import java.util.Hashtable; import java.util.Iterator; import java.util.Li ...
- 键值对Dictionary、KeyValuePair、Hashtable 简单使用。
KeyValuePair是单个的键值对对象.KeyValuePair可用于接收combox选定的值. 例如:KeyValuePair<string, object> par = (KeyV ...
- 【Java基础】ConcurrentHashMap为什么不能存null键和null值
代码如下 /** * 测试ConcurrentHashMap null键和null值的问题 * @return */ @RequestMapping(value = "/get_nacos& ...
- PHP合并2个数字键数组的值
先要了解一个基础知识点:PHP数组合并+与array_merge的区别分析 & 对多个数组合并去重技巧 <?php /** * PHP合并2个数字键数组的值 * * @param arr ...
- 存储数据键和项目对的类(Dictionary对象)
存储数据键和项目对的类(Dictionary对象) <% Class Dictionary Public Copyright, Developer, Name, Version, Web Pri ...
- php--------合并2个数字键数组的值
开发中遇到了,数组合并并去除重复这个功能,查阅资料, 找到了一个方法,分享一下. <?php /** * PHP合并2个数字键数组的值 * * @param array $arr1 * @par ...
- python中字典,没键加键,有键操作其键对应的值,的思想
cars = ['鲁A32444', '鲁B12333', '京B8989M', '黑C49678', '黑C46555', '沪B25041', '黑C34567'] locations = {'沪 ...
- 【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" ...
- (原)未能启用约束。一行或多行中包含违反非空、唯一或外键约束的值与DATEADD
SQLServer2014,查询分析器中 这样的脚本是没有问题的:AND TPO.CREATEON <= DATEADD(DAY, 1, '2017/3/3 0:00:00') 但.NET D ...
随机推荐
- 用Kinect为听障人士架一座沟通的桥梁
编者按:这是微软亚洲研究院和中国科学院共同进行的一个合作项目,希望通过使用Kinect来帮助提升手语的识别率,从而为听力受损的残障人士(以下简称听障人士)架起一座与外界沟通的桥梁. 文章译自:Digi ...
- Zabbix 监控sqlserver
转:Zabbix 监控sqlserver 一:Zabbix监控sqlserver 方法一: 1.思路整理 1.在zabbix server上安装Freetds.unixODBC.unixODBC-de ...
- 吴裕雄--天生自然python学习笔记:打开文件并显示文件内容
Win32com 组件打开文件通过 Documents 的 Open 方法,语法为 : 例如,打开上一节创建的 testl . docx 文件 , 文件变量名为 doc: 获得文件内容的方法有两种,第 ...
- 吴裕雄--天生自然 HADOOP大数据分布式处理:添加主机和服务器的域名映射
- HotSpot Java对象创建,内存布局以及访问方式
内存中对象的创建.对象的结构以及访问方式. 一.对象的创建 在语言层面上,对象的创建只不过是一个new关键字而已,那么在虚拟机中又是一个怎样的过程呢? (一)判断类是否加载.虚拟机遇到一条new指令的 ...
- jquery框架概览(二)
(function(window, undefined) { })(window) window对象作为参数传进闭包的好处 JavaScript 全局对象.函数以及变量均自动成为 window 对象的 ...
- Invalid action class configuration that references an unknown class解决方案
Sturts2整合后时出现诡异的异常: java.lang.RuntimeException: Invalid action class configuration that references a ...
- 重复测量的方差分析|Mauchly's Test of Sphericity|
生物统计学-重复测量的方差分析 之前的方差分析应用条件要求组之间是独立的,即某种因素下相同时段测量的结果数据,但4月与5月数据是有关系的,所以必须考虑某种因素下不同时段测量的结果数据,即使用重复测量的 ...
- JS做深度学习3——数据结构
最近在上海上班了,很久没有写博客了,闲下来继续关注和研究Tensorflow.js 关于深度学习的文章我也已经写了不少,部分早期作品可能包含了不少错误的认识,在后面的博文中会改进或重新审视. 今天聊聊 ...
- 吴裕雄--天生自然 R语言数据分析:火箭发射的地点、日期/时间和结果分析
dfS = read.csv("F:\\kaggleDataSet\\spacex-missions\\database.csv") library(dplyr) library( ...