• C# 存储相同键多个值的Dictionary


    涉及到两个问题:

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

    先看一下磁盘文件夹结构

    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();
            }

      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,今天的分享就到这里啦,有问题欢迎指出。

  • 相关阅读:
    Android Service
    Java 关键字 static final
    Django | mysql修改个别表后save()报错
    Django | Unable to get repr for <class 'django.db.models.query.QuerySet'>
    MySQL | linux中数据库导出和导入
    MySQL | 查看log日志
    python | log日志
    python | 网络编程(socket、udp、tcp)
    Python | 异常处理
    Python | 单例模式
  • 原文地址:https://www.cnblogs.com/guhuazhen/p/12454050.html
Copyright © 2020-2023  润新知