C#存储相同键多个值的Dictionary实例详解
涉及到两个问题:
一、访问磁盘中文件夹、文件夹下面的文件夹
先看一下磁盘文件夹结构
C盘下面有个根文件夹SaveFile,SaveFIle下面有两个子文件夹分别为,2018、2019,
子文件下2018下面有两个子文件夹18120和18131
子文件下2019下面有两个子文件夹18120和18129
现在希望把SaveFile子文件夹和子文件夹下面的文件夹的名称存起来,也就是下面这样的
2018 18120
18131
201918120
18129
二、基于以上的结构我们要怎么样存数据呢
其实我一开始自己也没绕出来的,最初想到的是使用Dictionary,键值对的方式存数据,但是一开始没想那么多,就一顿猛操作,发现有一个问题
不能存在相同键????突然有点懵逼,不知道咋写了,,,,此时又想到了用哈希表Hashtable
下面是Hashtable简单使用的方法
usingSystem; usingSystem.Collections; namespaceCollectionsApplication { classProgram { staticvoidMain(string[]args) { Hashtableht=newHashtable(); ht.Add("001","ZaraAli"); ht.Add("002","AbidaRehman"); ht.Add("003","JoeHolzner"); ht.Add("004","MausamBenazirNur"); ht.Add("005","M.Amlan"); ht.Add("006","M.Arif"); ht.Add("007","RiteshSaikia"); if(ht.ContainsValue("NuhaAli")) { Console.WriteLine("Thisstudentnameisalreadyinthelist"); } else { ht.Add("008","NuhaAli"); } //获取键的集合 ICollectionkey=ht.Keys; foreach(stringkinkey) { Console.WriteLine(k+":"+ht[k]); } Console.ReadKey(); } }
Hashtable和Dictionary都存在一个问题不能存在相同键的问题,那我还是比较想使用Dictionary,接下来我们来尝试一下Dictionary完成吧,
usingSystemusingSystem.Collections;namespaceCollectionsApplication{classProgram{ privateconststringSavePath=@"C:\SavaFile\"; publicstaticListYearStr=newList (){};//存年份 //存年份和编号 publicstaticDictionary >dic=newDictionary >(){}; staticvoidMain(string[]args) { #region DirectoryInfobaseDir=newDirectoryInfo(SavePath);//读取C:\SavaFile\路径下的子目录 DirectoryInfo[]dii=baseDir.GetDirectories();//存SaveFile文件夹子目录 foreach(varitemindii){dic.Add(item.Name,null);YearStr.Add(item.Name);//将SaveFile文件夹添加到YearStr集合中 } DirectoryInfodir; foreach(variteminYearStr) { dir=newDirectoryInfo(SavePath+@"\"+item);//存SaveFile文件夹子目录下的子目录DirectoryInfo[]diis=dir.GetDirectories(); List Panlelst=newList (){};//用来保存value foreach(varitem2indiis) { if(dic.ContainsKey(item))//如果Dictionary中包含了某个键 { Panlelst.Add(item2.Name);//值添加值集合中 dic[item]=Panlelst;//赋值到对应key中 } } } //遍历字典 foreach(KeyValuePair >kvpindic) { foreach(variteminkvp.Value) { Console.WriteLine("Key={0},Value={1}",kvp.Key,item); } } Console.ReadLine(); #endregion } }
ok,我尝试成功啦,
输出结果看一下
再贴一些dictionary的一些常见用法吧,温故知新
staticvoidMain(string[]args) { //创建泛型哈希表,Key类型为int,Value类型为string Dictionary附加:HashTable和Dictionary的区别myDictionary=newDictionary (); //1.添加元素 myDictionary.Add(1,"a"); myDictionary.Add(2,"b"); myDictionary.Add(3,"c"); //2.删除元素 myDictionary.Remove(3); //3.假如不存在元素则添加元素 if(!myDictionary.ContainsKey(4)) { myDictionary.Add(4,"d"); } //4.显示容量和元素个数 Console.WriteLine("元素个数:{0}",myDictionary.Count); //5.通过key查找元素 if(myDictionary.ContainsKey(1)) { Console.WriteLine("key:{0},value:{1}","1",myDictionary[1]); Console.WriteLine(myDictionary[1]); } //6.通过KeyValuePair遍历元素 foreach(KeyValuePair kvpinmyDictionary) { Console.WriteLine("key={0},value={1}",kvp.Key,kvp.Value); } //7.得到哈希表键的集合 Dictionary .KeyCollectionkeyCol=myDictionary.Keys; //遍历键的集合 foreach(intninkeyCol) { Console.WriteLine("key={0}",n); } //8.得到哈希表值的集合 Dictionary .ValueCollectionvalCol=myDictionary.Values; //遍历值的集合 foreach(stringsinvalCol) { Console.WriteLine("value:{0}",s); } //9.使用TryGetValue方法获取指定键对应的值 stringslove=string.Empty; if(myDictionary.TryGetValue(5,outslove)) { Console.WriteLine("查找结果:{0}",slove); } else { Console.WriteLine("查找失败"); } //10.清空哈希表 //myDictionary.Clear(); Console.ReadKey(); }
1.HashTable
哈希表(HashTable)表示键/值对的集合。在.NETFramework中,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
他本身有集合的功能有时候可以把它看成数组
他的结构是这样的:Dictionary<[key],[value]>
他的特点是存入对象是需要与[key]值一一对应的存入该泛型
通过某一个一定的[key]去找到对应的值
3.HashTable和Dictionary的区别:https://www.nhooo.com/article/182337.htm
(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实例详解的文章就介绍到这了,更多相关C#存储相同键多个值的Dictionary方法内容请搜索毛票票以前的文章或继续浏览下面的相关文章希望大家以后多多支持毛票票!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。