欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-06-21 08:45:59
涉及到两个问题:一、访问磁盘中文件夹、文件夹下面的文件夹先看一下磁盘文件夹结构c盘下面有个根文件夹savefile,savefile下面有两个子文件夹分别为,2018、2019,子文件下2018下面有...

涉及到两个问题:

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

先看一下磁盘文件夹结构

c盘下面有个根文件夹savefile,savefile下面有两个子文件夹分别为,2018、2019,

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

子文件下2018下面有两个子文件夹18120和18131

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

子文件下2019下面有两个子文件夹18120和18129

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

现在希望把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,我尝试成功啦,

输出结果看一下

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

再贴一些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();
 }

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实例详解的文章就介绍到这了,更多相关c#存储相同键多个值的dictionary方法内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!