首页 > C#泛型-泛型集合DictionaryK,V

C#泛型-泛型集合DictionaryK,V

在System.Collections.Generic命名空间中,与ArrayList相对应的泛型集合是List,与 HashTable相对应的泛型集合是Dictionary,其存储数据的方式与哈希表相似,通过键/值来保存元素,并具有泛型的 全部特征,编译时检查类型约束,读取时无须类型转换。

电话本存储的例子中,使用Dictionary来存储电话本信息,代码如下:

Dictionary ht=new Dictionary();

在Dictionary声明中,“”中的string表示集合中Key的类型,TelNote表示Value的类型,定义Dictionary泛型集合中的方法如下:

Dictionary students=new Dictionary();

其中“K”为占位符,具体定义时用存储键“Key”的数据类型代替,“V”也是占位符,用元素的值“Value”的数据类型代替,这样就在定义该集合时,声明了存储元素的键和值的数据类型,保证了类型的安全性。

Dictionary中元素的操作方法与HashTable相似,添加元素,获取元素,删除元素,遍历集合元素的方法基本相同。

Dictionary和HashTable的区别

Dictionary和HashTable的相同点:添加元素,删除元素,通过键访问值的方法相同。

Dictionary和HashTable的不同点:

Dictionary对添加的元素具有类型约束,HashTable可添加任意类型的元素。

Dictionary不需要装箱、拆箱操作,HashTable添加时装箱,读取时拆箱。

在Dictionary集合中,除了通过键获取值的方法外,还有一种TryGetValue(key)方法,可以通过键获取值,该 方法返回值为布尔型,如果存在和键相对应的值,则返回true,否则返回false。避免了因获取不到相应值发生的异常。

using System;

using System.Collections.Generic;

class Program

{

static void Main()

{

   //创建Dictionary,然后添加元素

   Dictionary < string, string > film = new Dictionary < string, string > ();

   film.Add("韦小宝", "鹿鼎记");

   film.Add("陆小凤", "陆小凤传奇");

   film.Add("张无忌", "倚天屠龙记");

   film.Add("杨过", "神雕侠侣");

   film.Add("令狐冲", "笑傲江湖");

   Console.WriteLine("集合现在的元素个数为{0}", film.Count);

   film.Remove("杨过");

   //遍历集合

   Console.WriteLine("武侠电影的主角及电影名");

   Console.WriteLine(" 主角 电影");

   foreach (KeyValuePair < string, string > kvp in film)

   {

    Console.WriteLine(" {0} {1}", kvp.Key, kvp.Value);

   }

   //检查元素是否存在,如不存在,添加

   if (!film.ContainsKey("段誉"))

   {

    film.Add("段誉", "天龙八部");

   }

   //获取键的集合

   Dictionary < string, string > .KeyCollection keys = film.Keys;

   //遍历键的集合

   Console.WriteLine("受欢迎的武侠片中主角名");

   foreach (string str in keys)

   {

    Console.WriteLine(str);

   }

   Dictionary < string, string > .ValueCollection values = film.Values;

   //遍历值的集合

   Console.WriteLine("最受欢迎的武侠片");

   foreach (string strfilm in values)

   {

    Console.WriteLine(strfilm);

   }

   //遍历元素的另一种方法

   Console.WriteLine("和哈希表相同的遍历元素方法");

   foreach (string strname in film.Values)

   {

    Console.WriteLine(strname);

   }

   //获取键对应的值

   string myfilm = film["令狐冲"];

   Console.WriteLine("主角为令狐冲的电影名{0}", myfilm);

   //获取键对应值的TryGetValue方法

   string objfilm = string.Empty;

   if (film.TryGetValue("段誉", out objfilm))

   {

    Console.WriteLine("主角为段誉的电影是{0}", objfilm);

   }

   else

    Console.WriteLine("没有主角为段誉的电影");

   Console.ReadKey();

}

}

代码创建了一个Dictionary集合,键和值的数据类型是string类型,后边代码的元素添加,删除都和哈希表处理方法相 同,遍历元素时不需要进行数据类型强制转换。Dictionary通过键取值的TryGetValue方法,此方法包括两个参数, 一个是要查询的键,另一个是获取的值,注意值前面使用out关键字。

注意:使用TryGetValue方法时,参数一定要使用out关键字,否则编译失败。



http://hi.baidu.com/panjundao/blog/item/eb38e70c2ed558e1ab6457b1.html

更多相关:

  • importjava.security.SecureRandom;importjavax.crypto.Cipher;importjavax.crypto.SecretKey;importjavax.crypto.SecretKeyFactory;importjavax.crypto.spec.DESKeySpec;//结果与DES算...

  • 题目:替换空格 请实现一个函数,把字符串 s 中的每个空格替换成"%20"。 输入:s = "We are happy." 输出:"We%20are%20happy." 限制: 0 <= s 的长度 <= 10000 解题: 时间复杂度:O(n) 空间复杂度:O(n) class Solution { public:s...

  • 在C++11标准库中,string.h已经添加了to_string方法,方便从其他类型(如整形)快速转换成字面值。 例如: for (size_t i = 0; i < texArrSize; i++)RTX_Shader.SetInt(string("TexArr[") + to_string(i) + "]", 7 + i);...

  • Ubuntu 14.04安装并升级之后,变成楷体字体非常难看,我昨天搞了一晚上,终于理了个头绪,这里整理一下。 经过网上调研,大家的一致看法是,使用开源字体库文泉驿的微黑字体效果比较理想,甚至效果不输windows平台的雅黑字体。下面我打算微黑来美化Ubuntu 14.04. 1.安装文泉驿微黑字体库 sudo aptitude...

  • 使用string时发现了一些坑。 我们知道stl 容器并不是线程安全的,所以在使用它们的过程中往往需要一些同步机制来保证并发场景下的同步更新。 应该踩的坑还是一个不拉的踩了进去,所以还是记录一下吧。 string作为一个容器,随着我们的append 或者 针对string的+ 操作都会让string内部的数据域动态增加,而动态增加的...

  • 栈stack:stack 后入先出(LIFO) q.top()获取栈顶元素(并不删除)q.pop()删除栈顶元素q.push(x)向栈中加入元素q.empty()判断栈是否为空 队列queue:先入先出(FIFO)   q.front()获取队首元素(并不删除)q.pop()删除队首元素q.push(x)向队列中加入元素q....

  • resize(),设置大小(size); reserve(),设置容量(capacity); size()是分配容器的内存大小,而capacity()只是设置容器容量大小,但并没有真正分配内存。 打个比方:正在建造的一辆公交车,车里面可以设置40个座椅(reserve(40);),这是它的容量,但并不是说它里面就有了40个座椅,只能说...

  • v-for="(index,$i) in total" :key="$i":style="{left:`${itemWidth*((index-1)%rowItemCount)}px`,top:`${itemHeight*(Math.ceil(index/rowItemCount)-1)}px`}" //total是显示总数量 //l...

  •   技巧一(推荐指数★★★★★) 采用top、right、bottom、left,可以不在乎父元素的宽度和高度,对GPU损耗低于技巧三,但是对浏览器内存的消耗高于技巧三 .子元素 {/*父元素需要position: relative|absolute;*/position: absolute;margin: auto;to...

  • 设计一个支持 push,pop,top 操作,并能在常数时间内检索到最小元素的栈。 push(x) – 将元素 x 推入栈中。pop() – 删除栈顶的元素。top() – 获取栈顶元素。getMin() – 检索栈中的最小元素。 示例: MinStack minStack = new MinStack(); minStack...