C# 存儲相同鍵多個值的Dictionary

  • 2020 年 3 月 12 日
  • 筆記

涉及到兩個問題:

一、訪問磁碟中文件夾、文件夾下面的文件夾

先看一下磁碟文件夾結構

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("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都存在一個問題不能存在相同鍵的問題,那我還是比較想使用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路徑下的子目錄

ok,我嘗試成功啦,

輸出結果看一下

再貼一些dictionary的一些常見用法吧,溫故知新

 static void Main(string[] args)          {              //創建泛型哈希表,Key類型為int,Value類型為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.顯示容量和元素個數              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<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(5, out slove))              {                  Console.WriteLine("查找結果:{0}", slove);              }              else              {                  Console.WriteLine("查找失敗");              }              //10.清空哈希表              //myDictionary.Clear();              Console.ReadKey();          }

附加:HashTable和Dictionary的區別

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,今天的分享就到這裡啦,有問題歡迎指出。