C#存储相同键多个值的Dictionary实例详解

 更新时间:2020年6月25日 10:35  点击:1549

涉及到两个问题:

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

先看一下磁盘文件夹结构

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\路径下的子目录
      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(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的区别:https://www.jb51.net/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方法内容请搜索猪先飞以前的文章或继续浏览下面的相关文章希望大家以后多多支持猪先飞!

[!--infotagslink--]

相关文章

  • C#实现简单的登录界面

    我们在使用C#做项目的时候,基本上都需要制作登录界面,那么今天我们就来一步步看看,如果简单的实现登录界面呢,本文给出2个例子,由简入难,希望大家能够喜欢。...2020-06-25
  • 浅谈C# 字段和属性

    这篇文章主要介绍了C# 字段和属性的的相关资料,文中示例代码非常详细,供大家参考和学习,感兴趣的朋友可以了解下...2020-11-03
  • C#中截取字符串的的基本方法详解

    这篇文章主要介绍了C#中截取字符串的的基本方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-11-03
  • C#连接SQL数据库和查询数据功能的操作技巧

    本文给大家分享C#连接SQL数据库和查询数据功能的操作技巧,本文通过图文并茂的形式给大家介绍的非常详细,需要的朋友参考下吧...2021-05-17
  • C#实现简单的Http请求实例

    这篇文章主要介绍了C#实现简单的Http请求的方法,以实例形式较为详细的分析了C#实现Http请求的具体方法,需要的朋友可以参考下...2020-06-25
  • C#中new的几种用法详解

    本文主要介绍了C#中new的几种用法,具有很好的参考价值,下面跟着小编一起来看下吧...2020-06-25
  • 使用Visual Studio2019创建C#项目(窗体应用程序、控制台应用程序、Web应用程序)

    这篇文章主要介绍了使用Visual Studio2019创建C#项目(窗体应用程序、控制台应用程序、Web应用程序),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2020-06-25
  • C#开发Windows窗体应用程序的简单操作步骤

    这篇文章主要介绍了C#开发Windows窗体应用程序的简单操作步骤,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-04-12
  • C#从数据库读取图片并保存的两种方法

    这篇文章主要介绍了C#从数据库读取图片并保存的方法,帮助大家更好的理解和使用c#,感兴趣的朋友可以了解下...2021-01-16
  • C#和JavaScript实现交互的方法

    最近做一个小项目不可避免的需要前端脚本与后台进行交互。由于是在asp.net中实现,故问题演化成asp.net中jiavascript与后台c#如何进行交互。...2020-06-25
  • C++调用C#的DLL程序实现方法

    本文通过例子,讲述了C++调用C#的DLL程序的方法,作出了以下总结,下面就让我们一起来学习吧。...2020-06-25
  • 轻松学习C#的基础入门

    轻松学习C#的基础入门,了解C#最基本的知识点,C#是一种简洁的,类型安全的一种完全面向对象的开发语言,是Microsoft专门基于.NET Framework平台开发的而量身定做的高级程序设计语言,需要的朋友可以参考下...2020-06-25
  • C#变量命名规则小结

    本文主要介绍了C#变量命名规则小结,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-09-09
  • C#绘制曲线图的方法

    这篇文章主要介绍了C#绘制曲线图的方法,以完整实例形式较为详细的分析了C#进行曲线绘制的具体步骤与相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下...2020-06-25
  • C# 中如何取绝对值函数

    本文主要介绍了C# 中取绝对值的函数。具有很好的参考价值。下面跟着小编一起来看下吧...2020-06-25
  • c#自带缓存使用方法 c#移除清理缓存

    这篇文章主要介绍了c#自带缓存使用方法,包括获取数据缓存、设置数据缓存、移除指定数据缓存等方法,需要的朋友可以参考下...2020-06-25
  • c#中(&&,||)与(&,|)的区别详解

    这篇文章主要介绍了c#中(&&,||)与(&,|)的区别详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-06-25
  • 经典实例讲解C#递归算法

    这篇文章主要用实例讲解C#递归算法的概念以及用法,文中代码非常详细,帮助大家更好的参考和学习,感兴趣的朋友可以了解下...2020-06-25
  • C#学习笔记- 随机函数Random()的用法详解

    下面小编就为大家带来一篇C#学习笔记- 随机函数Random()的用法详解。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2020-06-25
  • C#中list用法实例

    这篇文章主要介绍了C#中list用法,结合实例形式分析了C#中list排序、运算、转换等常见操作技巧,具有一定参考借鉴价值,需要的朋友可以参考下...2020-06-25