C#存儲(chǔ)相同鍵多個(gè)值的Dictionary實(shí)例詳解
涉及到兩個(gè)問(wèn)題:
一、訪問(wèn)磁盤(pán)中文件夾、文件夾下面的文件夾
先看一下磁盤(pán)文件夾結(jié)構(gòu)
C盤(pán)下面有個(gè)根文件夾SaveFile,SaveFIle下面有兩個(gè)子文件夾分別為,2018、2019,
子文件下2018下面有兩個(gè)子文件夾18120和18131
子文件下2019下面有兩個(gè)子文件夾18120和18129
現(xiàn)在希望把SaveFile子文件夾和子文件夾下面的文件夾的名稱(chēng)存起來(lái),也就是下面這樣的
2018 18120
18131
2019 18120
18129
二、基于以上的結(jié)構(gòu)我們要怎么樣存數(shù)據(jù)呢
其實(shí)我一開(kāi)始自己也沒(méi)繞出來(lái)的,最初想到的是使用Dictionary,鍵值對(duì)的方式存數(shù)據(jù),但是一開(kāi)始沒(méi)想那么多,就一頓猛操作,發(fā)現(xiàn)有一個(gè)問(wèn)題
不能存在相同鍵????突然有點(diǎn)懵逼,不知道咋寫(xiě)了,,,,此時(shí)又想到了用哈希表Hashtable
下面是Hashtable簡(jiǎn)單使用的方法
using System; using System.Collections; namespace CollectionsApplication { class Program { static void Main(string[] args) { Hashtable ht = new Hashtable(); ht.Add("001", "Zara Ali"); ht.Add("002", "Abida Rehman"); ht.Add("003", "Joe Holzner"); ht.Add("004", "Mausam Benazir Nur"); ht.Add("005", "M. Amlan"); ht.Add("006", "M. Arif"); ht.Add("007", "Ritesh Saikia"); if (ht.ContainsValue("Nuha Ali")) { Console.WriteLine("This student name is already in the list"); } else { ht.Add("008", "Nuha Ali"); } // 獲取鍵的集合 ICollection key = ht.Keys; foreach (string k in key) { Console.WriteLine(k + ": " + ht[k]); } Console.ReadKey(); } }
Hashtable和Dictionary都存在一個(gè)問(wèn)題不能存在相同鍵的問(wèn)題,那我還是比較想使用Dictionary,接下來(lái)我們來(lái)嘗試一下Dictionary完成吧,
using Systemusing System.Collections;namespace CollectionsApplication{ class Program { private const string SavePath = @"C:\SavaFile\"; public static List<string> YearStr = new List<string>() { };//存年份 //存年份和編號(hào) 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文件夾添加到Y(jié)earStr集合中 } DirectoryInfo dir; foreach (var item in YearStr) { dir = new DirectoryInfo(SavePath+@"\"+item); //存SaveFile文件夾子目錄下的子目錄 DirectoryInfo[] diis = dir.GetDirectories(); List<string> Panlelst = new List<string>() { };//用來(lái)保存value foreach (var item2 in diis) { if (dic.ContainsKey(item))//如果Dictionary中包含了某個(gè)鍵 { Panlelst.Add(item2.Name);//值添加值集合中 dic[item] = Panlelst;//賦值到對(duì)應(yīng)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,我嘗試成功啦,
輸出結(jié)果看一下
再貼一些dictionary的一些常見(jiàn)用法吧,溫故知新
static void Main(string[] args) { //創(chuàng)建泛型哈希表,Key類(lèi)型為int,Value類(lèi)型為string Dictionary<int, string> myDictionary = new Dictionary<int, string>(); //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.顯示容量和元素個(gè)數(shù) Console.WriteLine("元素個(gè)數(shù):{0}",myDictionary.Count); //5.通過(guò)key查找元素 if (myDictionary.ContainsKey(1)) { Console.WriteLine("key:{0},value:{1}","1", myDictionary[1]); Console.WriteLine(myDictionary[1]); } //6.通過(guò)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方法獲取指定鍵對(duì)應(yīng)的值 string slove = string.Empty; if (myDictionary.TryGetValue(5, out slove)) { Console.WriteLine("查找結(jié)果:{0}", slove); } else { Console.WriteLine("查找失敗"); } //10.清空哈希表 //myDictionary.Clear(); Console.ReadKey(); }
1.HashTable
哈希表(HashTable)表示鍵/值對(duì)的集合。在.NET Framework中,Hashtable是System.Collections命名空間提供的一個(gè)容器,用于處理和表現(xiàn)類(lèi)似key-value的鍵值對(duì),其中key通??捎脕?lái)快速查找,同時(shí)key是區(qū)分大小寫(xiě);value用于存儲(chǔ)對(duì)應(yīng)于key的值。Hashtable中key-value鍵值對(duì)均為object類(lèi)型,所以Hashtable可以支持任何類(lèi)型的keyvalue鍵值對(duì),任何非 null 對(duì)象都可以用作鍵或值。
在哈希表中添加一個(gè)key/鍵值對(duì):HashtableObject.Add(key,);
在哈希表中去除某個(gè)key/鍵值對(duì):HashtableObject.Remove(key);
從哈希表中移除所有元素: HashtableObject.Clear();
判斷哈希表是否包含特定鍵key: HashtableObject.Contains(key);
2.Dictionary
Dictionary表示鍵和值的集合。
Dictionary<string, string>是一個(gè)泛型
他本身有集合的功能有時(shí)候可以把它看成數(shù)組
他的結(jié)構(gòu)是這樣的:Dictionary<[key], [value]>
他的特點(diǎn)是存入對(duì)象是需要與[key]值一一對(duì)應(yīng)的存入該泛型
通過(guò)某一個(gè)一定的[key]去找到對(duì)應(yīng)的值
3.HashTable和Dictionary的區(qū)別:http://www.dbjr.com.cn/article/182337.htm
(1).HashTable不支持泛型,而Dictionary支持泛型。
(2). Hashtable 的元素屬于 Object 類(lèi)型,所以在存儲(chǔ)或檢索值類(lèi)型時(shí)通常發(fā)生裝箱和拆箱的操作,所以你可能需要進(jìn)行一些類(lèi)型轉(zhuǎn)換的操作,而且對(duì)于int,float這些值類(lèi)型還需要進(jìn)行裝箱等操作,非常耗時(shí)。
(3).單線程程序中推薦使用 Dictionary, 有泛型優(yōu)勢(shì), 且讀取速度較快, 容量利用更充分。多線程程序中推薦使用 Hashtable, 默認(rèn)的 Hashtable 允許單線程寫(xiě)入, 多線程讀取, 對(duì) Hashtable 進(jìn)一步調(diào)用 Synchronized() 方法可以獲得完全線程安全的類(lèi)型. 而 Dictionary 非線程安全, 必須人為使用 lock 語(yǔ)句進(jìn)行保護(hù), 效率大減。
(4)在通過(guò)代碼測(cè)試的時(shí)候發(fā)現(xiàn)key是整數(shù)型Dictionary的效率比Hashtable快,如果key是字符串型,Dictionary的效率沒(méi)有Hashtable快。
ok,今天的分享就到這里啦,有問(wèn)題歡迎指出。
到此這篇關(guān)于C#存儲(chǔ)相同鍵多個(gè)值的Dictionary實(shí)例詳解的文章就介紹到這了,更多相關(guān)C#存儲(chǔ)相同鍵多個(gè)值的Dictionary方法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- C#中Dictionary泛型集合7種常見(jiàn)的用法
- C#針對(duì)xml文件轉(zhuǎn)化Dictionary的方法
- C#中Dictionary的作用及用法講解
- C#中查找Dictionary中重復(fù)值的方法
- C# Hashtable/Dictionary寫(xiě)入和讀取對(duì)比詳解
- C#中Dictionary幾種遍歷的實(shí)現(xiàn)代碼
- c# 遍歷 Dictionary的四種方式
- C# Dictionary和SortedDictionary的簡(jiǎn)介
- C#數(shù)組中List, Dictionary的相互轉(zhuǎn)換問(wèn)題
- 分析C# Dictionary的實(shí)現(xiàn)原理
相關(guān)文章
winform 使用Anchor屬性進(jìn)行界面布局的方法詳解
這篇文章主要介紹了winform 使用Anchor屬性進(jìn)行界面布局的方法,有需要的朋友可以參考一下2013-12-12C#使用foreach語(yǔ)句遍歷集合類(lèi)型的方法
這篇文章主要介紹了C#使用foreach語(yǔ)句遍歷集合類(lèi)型的方法,可實(shí)現(xiàn)通過(guò)foreach語(yǔ)句遍歷集合類(lèi)的功能,需要的朋友可以參考下2015-06-06C#中Winfrom默認(rèn)輸入法的設(shè)置方法
這篇文章主要介紹了C#中Winfrom默認(rèn)輸入法的設(shè)置方法,以實(shí)例形式較為詳細(xì)的分析了C#中輸入法設(shè)置的相關(guān)技巧,需要的朋友可以參考下2015-05-05