C#泛型集合Dictionary的使用方法
1、要使用dictionary集合,需要导入c#泛型命名空间
system.collections.generic(程序集:mscorlib)
2、描述
1)、从一组键(key)到一组值(value)的映射,每一个添加项都是由一个值及其相关连的键组成
2)、任何键都必须是唯一的
3)、键不能为空引用null(vb中的nothing),若值为引用类型,则可以为空值
4)、key和value可以是任何类型(string,int,custom class 等)
3、创建及初始化
dictionary<int, string> mydictionary = new dictionary<int, string>();
4、添加元素
mydictionary.add("c#",0);
mydictionary.add("c++",1);
mydictionary.add("c",2);
mydictionary.add("vb",2);
5、查找元素by key
if(mydictionary.containskey("c#"))
{
console.writeline("key:{0},value:{1}", "c#", mydictionary["c#"]);
}
6.遍历元素 by keyvaluepair
foreach (keyvaluepair<string, int> kvp in mydictionary)
{
console.writeline("key = {0}, value = {1}",kvp.key, kvp.value);
}
7、仅遍历键 by keys 属性
dictionary<string, int>.keycollection keycol = mydictionary.keys;
foreach (string key in keycol/*string key in mydictionary.keys*/)
{
console.writeline("key = {0}", key);
}
8、仅遍历值by valus属性
dictionary<string, int>.valuecollection valuecol = mydictionary.values;
foreach (int value in valuecol)
{
console.writeline("value = {0}", value);
}
9.移除指定的键值by remove方法
mydictionary.remove("c#");
if (mydictionary.containskey("c#"))
{
console.writeline("key:{0},value:{1}", "c#", mydictionary["c#"]);
}
else
{
console.writeline("不存在 key : c#");
}
在system.collections.generic命名空间中,与arraylist相对应的泛型集合是list<t>,与 hashtable相对应的泛型集合是dictionary<k,v>,其存储数据的方式与哈希表相似,通过键/值来保存元素,并具有泛型的全部特征,编译时检查类型约束,读取时无须类型转换。
电话本存储的例子中,使用dictionary<k,v>来存储电话本信息,代码如下:
dictionary<string,telnote> ht=new dictionary<string,telnote>();
在dictionary<k,v>声明中,“<string,telnote>”中的string表示集合中key的类型,telnote表示value的类型,定义dictionary<k,v>泛型集合中的方法如下:
dictionary<k,v> students=new dictionary<k,v>();
其中“k”为占位符,具体定义时用存储键“key”的数据类型代替,“v”也是占位符,用元素的值“value”的数据类型代替,这样就在定义该集合时,声明了存储元素的键和值的数据类型,保证了类型的安全性。
dictionary<k,v>中元素的操作方法与hashtable相似,添加元素,获取元素,删除元素,遍历集合元素的方法基本相同。
dictionary<k,v>和hashtable的区别
dictionary<k,v>和hashtable的相同点:添加元素,删除元素,通过键访问值的方法相同。
dictionary<k,v>和hashtable的不同点:
dictionary<k,v>对添加的元素具有类型约束,hashtable可添加任意类型的元素。
dictionary<k,v>不需要装箱、拆箱操作,hashtable添加时装箱,读取时拆箱。
在dictionary<k,v>集合中,除了通过键获取值的方法外,还有一种trygetvalue(key)方法,可以通过键获取值,该方法返回值为布尔型,如果存在和键相对应的值,则返回true,否则返回false。避免了因获取不到相应值发生的异常。
using system;
using system.collections.generic;
class program
{
static void main()
{
//创建dictionary<k,v>,然后添加元素
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("/t主角/t电影");
foreach (keyvaluepair < string, string > kvp in film)
{
console.writeline("/t{0}/t{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<k,v>集合,键和值的数据类型是string类型,后边代码的元素添加,删除都和哈希表处理方法相同,遍历元素时不需要进行数据类型强制转换。dictionary<k,v>通过键取值的trygetvalue方法,此方法包括两个参数,一个是要查询的键,另一个是获取的值,注意值前面使用out关键字。
注意:使用trygetvalue方法时,参数一定要使用out关键字,否则编译失败。
推荐阅读
-
C#泛型集合Dictionary
的使用方法 -
【转载】 C#中常见的泛型集合类有哪些
-
C#常见的几种集合 ArrayList,Hashtable,List
,Dictionary 遍历方法对比 -
C#中Dictionary泛型集合7种常见的用法
-
C#程序编写高质量代码改善的157个建议【20-22】[泛型集合、选择集合、集合的安全]
-
C#中把任意类型的泛型集合转换成SQLXML数据格式的实例
-
C#中利用LINQ to XML与反射把任意类型的泛型集合转换成XML格式字符串的方法
-
C#控制台基础 List泛型集合与对应的数组相互转换实现代码
-
C# 泛型集合的自定义类型排序的实现
-
【转载】 C#中常见的泛型集合类有哪些