1.C#泛型-泛型集合Dictionary<Key,Value>
Dictionary<Key,Value>是一个泛型,它本身有集合的功能有时候可以它看成是数组,它的结构是这样的:Dictionary<[Key],[Value]>,它的特点是存入对象需要与[Key]值一一对应的存入该泛型,通过某一个一定的[Key]去找到对应的值[Key]不能重复。它的单个数组是KeyValuePair<Key,Value>,[Value]可以是string,int 和一个类等等。
在System.Collections.Generic命名空间中,与ArrayList相对应的泛型集合是List<T>,与HashTable相对应的泛型集合是Dictionary<Key,Value>,其存储数据方式与哈希表相似,通过键/值来保存元素,并具有泛型的全部特征,编译时检查类型约束,读取时无需类型转换。
Dictionary<Key,Value> student = new Dictionary<Key,Value>();
其中“K”为占位符,具体定义时用存储键“Key”的数据类型代替,“Value”也是占位符,用元素的值“Value”的数据类型代替,这样就在定义该集合时,声明了存储元素的键和值的数据类型,保证了类型的安全性。
Dictionary<Key,Value>中元素的操作方法与HashTable相似,添加元素,获取元素,删除元素,遍历集合元素的方法基本相同。
Dictionary<Key,Value>和HashTable的区别
Dictionary<Key,Value>和HashTable的相同点:添加元素,删除元素,通过键访问值的方法相同。
Dictionary<Key,Value>和HashTable的不同点:
Dictionary<Key,Value>对添加的元素具有类型约束,HashTable可添加任意类型的元素。
Dictionary<Key,Value>不需要装箱、拆箱操作,HashTable添加时装箱,读取时拆箱。
Dictionary<Key,Value>集合中,除了通过键获取值得方法外,还有一种TryGetValue(Key)方法,可以通过键获取值,该方法返回值为布尔型,如果存在和键相对应的值,则返回true,否则返回false。避免了因获取不到相应值发生的异常。
代码示例:
public static void Main(string[] args)
{
//创建Dictionary<K,V>然后添加元素
Dictionary<string, string> film = new Dictionary<string, string>();
film.Add("杨过", "神雕侠侣");
film.Add("聂风", "雄霸天下");
film.Add("令狐冲", "笑傲江湖");
film.Add("张无忌", "倚天屠龙记");
Console.WriteLine("集合现在的元素个数为:{0}", film.Count);
//检查元素是否存在,如不存在,添加
if (!film.ContainsKey("段誉"))
{
film.Add("段誉", "天龙八部");
}
//遍历集合
foreach (KeyValuePair<string, string> kvp in film)
{
Console.WriteLine("\t{0}\t{1}", kvp.Key, kvp.Value);
}
//获取键的集合
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 strName in values)
{
Console.WriteLine(strName);
}
//遍历元素的另一种方法
Console.WriteLine("和哈希表相同的遍历<值>元素方法");
foreach (string strName in film.Values)
{
Console.WriteLine(strName);
}
Console.WriteLine("和哈希表相同的遍历<键>元素方法");
foreach (string str in film.Keys)
{
Console.WriteLine(str);
}
//获取键对应值的TryGetValue方法
string objfilm = string.Empty;
if (film.TryGetValue("段誉", out objfilm))
{
Console.WriteLine("主角为段誉的电影是:{0}", objfilm);
}
else
{
Console.WriteLine("没有主角为段誉的电影");
}
Console.ReadKey();
}