C#存储相同键多个值的Dictionary
writeline方法属于类涉及到两个问题:
⼀、访问磁盘中⽂件夹、⽂件夹下⾯的⽂件夹
先看⼀下磁盘⽂件夹结构
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 System using 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,今天的分享就到这⾥啦,有问题欢迎指出。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。