我们用的比较多的非泛型集合类主要有 ArrayList类 和 HashTable类。我们经常用HashTable 来存储将要写入到数据库或者返回的信息,在这之间要不断的进行类型的转化,增加了系统装箱和拆箱的负担,如果我们操纵的数据类型相对确定的化 用 Dictionary<TKey,TValue> 集合类来存储数据就方便多了,例如我们需要在电子商务网站中存储用户的购物车信息( 商品名,对应的商品个数)时,完全可以用 Dictionary<string, int> 来存储购物车信息,而不需要任何的类型转化。
Dictionary<string, string>是一个泛型 他本身有集合的功能有时候可以把它看成数组,他的结构是这样的Dictionary<[key], [value]> 他的特点是存入对象是需要与[key]值一一对应的存入该泛型 通过某一个一定的[key]去找到对应的值。但是它比數組更加人性化就像你去找一栋房子,用数组的话你要你一栋栋找,用dictionary的话你知道地址就直接去了,这个地址可以是数子(和数组一样了)也可以是主人的名字,或者更复杂的数据结构。
下面是简单的例子,包括声明,填充键值对,移除键值对,遍历键值对
View Code
static void Main(string[] args) { Dictionary<string, string> dic = new Dictionary<string, string>(); dic.Add("1", "何晓阳"); dic.Add("3", "刘三云"); dic.Add("2", "何海燕"); //提取元素的方法 string a = dic["1"]; string b = dic["2"]; //上面代码中分别把值赋给了a,b,c //注意,键相当于找到对应值的唯一标识,所以不能重复 //但是值可以重复 if (!dic.ContainsKey("4")) { dic.Add("4", "ddd"); } else { Console.WriteLine("此键已存在"); } dic["5"] = "刘帅"; dic["6"] = "何德光"; //解决上面的异常的方法是使用ContarnsKey() 来判断时候存在键,如果经常要取健值得化最好用 TryGetValue方法来获取集合中的对应键值 string value = ""; if (dic.TryGetValue("6", out value)) { Console.WriteLine("存在的键\"fff\"的键值为:" + value); } else { Console.WriteLine("没有找到对应键的键值"); } var result = from pair in dic orderby pair.Key select pair; //这样的一句话就达到排序的功能啦 //下面用foreach 来遍历键值对 //泛型结构体 用来存储健值对 foreach (KeyValuePair<string, string> item in result) { Console.WriteLine("key={0},value={1}", item.Key, item.Value); } /* foreach (var item in dic.Values)//获取值得集合 { Console.WriteLine("value={0}", item); } Dictionary<string, string>.ValueCollection value = dic.Values;//获取值的另一种方式。 foreach (var item in value) { Console.WriteLine("value={0}", item); }*/ Console.ReadKey(); }
注意,键相当于找到对应值的唯一标识,所以不能重复.但是值是可以重复的。如果你还看不懂我最后给你举一个通俗的例子.有一缸米,你想在在每一粒上都刻上标记,不重复,相当于“键”当你找的时候一一对应不会找错,这就是这个泛型的键的-作用,而米可以一样,我的意思你明白了吧?
HashTable其實也差不多,與Dictionary非常類似。
View Code
static void Main() { Hashtable ht = new Hashtable(); ht.Add(1, "何晓阳"); ht.Add(2, "劉三云"); foreach (DictionaryEntry item in ht) { Console.WriteLine("key={0},value={1}", item.Key, item.Value); } Console.ReadKey(); }