范型编程系列三:泛型集合类Dictionary

using System;
using System.Collections.Generic;
using System.Text;
using System.Collections.Generic;

/*
 * 泛型就常见的用途是泛型集合,命空间System.Collections.Generic中包含了解一些基于泛型的集合类,使用泛型集合类,可以提供更高的类型安全性,还有更高的性能,避免了非泛型集合的重复的装箱和拆箱.
 * 很多非泛型集合类都有对应的泛型集合类,下面是常用的非泛型集合类以及对应的泛型集合类:
 *
 *   非泛型集合类                          泛型集合类
 *   ArrayList                              List<T>
 *   HashTable                              DIctionary<T>
 *   Queue                                  Queue<T>
 *   Stack                                  Stack<T>
 *   SortedList                             SortedList<T>
 *
 *  我们用的比较多的非泛型集合类主要有ArrayList类和HashTable类. 我们经常用HashTable来存储要写入到数据库或者返回的信息,在这之间要不断的进行了类型的转化,增加了系统装箱和拆箱的负担,
 *  如果说我们操纵的数据类型相对确定的化, 用Dictionary<TKey, TValue>集合类来存储数据就方便多了,例如我们需要在电子商务网站中存储用户服务的购物车信息(商品名,对应的商品个数)时,完全
 *  用Dictionary<string,int>来存储购物车信息,而不需要任何的类型转化.
 * */
namespace 集合类_六__Dictionary_泛型集合
{
    /// <summary>
    /// 包括声明,填充键值对,移除键值对,遍历键值对
    /// </summary>
    class Program
    {
        public void DictionaryTest()
        {
            Dictionary<string, string> myDic = new Dictionary<string, string>();
            myDic.Add("aaa", "111");
            myDic.Add("bbb", "222");
            myDic.Add("ccc", "333");
            myDic.Add("ddd", "444");

            //如果添加已存在的键,add方法会抛出异常
            try
            {
                myDic.Add("ddd", "ddd");
            }
            catch (Exception ex)
            {
                Console.WriteLine("此键已经存在: " + ex.Message);
            }

            //解决add()异常的方法是用ContainsKey()方法来判断键是否存在
            if (!myDic.ContainsKey("ddd"))
            {
                myDic.Add("ddd", "ddd");
            }
            else
            {
                Console.WriteLine("此键已经存在: ");
            }

            //解决add()异常的方法是用ContainsValue(0方法来判断键是否存在
            if (!myDic.ContainsValue("ddd", "ddd"))
            {
                myDic.Add("ddd", "ddd");
            }
            else
            {
                Console.WriteLine("此键已经存在: ");
            }

            //而使用索引器来负值时,如果键已经存在,就会修改已有的键的键值,而不会抛出异常
            myDic["ddd"] = "ddd";
            myDic["eee"] = "555";

            //使用索引器来取值时,如果键不存在就会引发异常
            try
            {
                Console.WriteLine("不存在的键的键为:" + myDic["fff"]);
            }
            catch (KeyNotFoundException ex)
            {
                Console.WriteLine("没有找一键引发异常:" + ex.Message);
            }

            //解决上面的异常的方法是使用ContarnsKey()来判断时候存在键,如果经常要取健值得话最好用TryGetValue方法来获取集合中的对应键值
            string value = "";
            if (myDic.TryGetValue("fff", out value))
            {
                Console.WriteLine("不存在的键的键值为: " + value);
            }
            else
            {
                Console.WriteLine("没有找到对应键的键值");
            }

            //下面用foreach来遍历键值对
            //泛型结构体,用来存储键值对
            foreach (KeyValuePair<string, string> kvp in myDic)
            {
                Console.WriteLine("key={0},value={1}", kvp.Key, kvp.Value);
            }

            //获取值得集合
            foreach (string s in myDic.Values)
            {
                Console.WriteLine("value={0}", s);
            }

            //获取值的另一种方式
            Dictionary<string, string>.ValueCollection values = myDic.Values;
            foreach (string s in values)
            {
                Console.WriteLine("value ={0}", s);
            }
        }

        static void Main(string[] args)
        {
        }
    }
}

/*
 *           常用属性                     属性说明
 *           Comparer                     获取用于确定字典中的键是否相等的 IEqualityComparer
 *           Count                        获取包含在Dictionary中的键/值对的数目
 *           Item                         获取或设置与指定键相关联的值.
 *           Keys                         获取包含Dictionary中的键的集合
 *           Values                       获取包含Dictionary中的值的集合
 *
 *           使用方法                     方法说明
 *           Add                          将指定的键和值添加到字典中
 *           Clear                        从Dictionary中移除所有的键和值
 *           ContainsKey                  确定Dictionary是否包含指定的键
 *           ContainsValue                确定Dictionary是否包含特定值
 *           Equals                       已重载.确定两个Object实例是否相等.  (从Object 继承)
 *           GetEnumerator                返回循环访问期间Dictionary的枚兴数
 *           GetHashCode                  用作特定类型的哈希表函数,GetHashCode适合在哈希算法和数据结构(如哈希表)中使用.(从Object继承)
 *           GetObjectData                实现 System.Runtime.Serialization.ISerializable 接口,并返回序列化 Dictionary 实例所需的数据。
 *           GetType                      获取当前实例的 Type。 (从 Object 继承。)
 *           OnDeserialization            实现 System.Runtime.Serialization.ISerializable 接口,并在完成反序列化之后引发反序列化事件。
 *           ReferenceEquals              确定指定的 Object 实例是否是相同的实例。 (从 Object 继承。)
 *           Remove                       从 Dictionary 中移除所指定的键的值。
 *           ToString                     返回表示当前 Object 的 String。 (从 Object 继承。)
 *           TryGetValue                  获取与指定的键相关联的值。
 * */
案例分析:

问题:存储城市信息,选择某个城市,相应的城市的区号、邮编、城市等级也显示出来

分析:要存储城市的信息没有合适的数据类型允许这样做,这时可以考虑用Hashtable类,我们可以将城市的名称作为键来引用,而将区号、邮编、城市等级作为值来引用。那我们是用一般集合,还是用泛型集合呢,推荐用泛型集合。因为它优点多多,见前面说的优点

 

namespace test
{
    public class CityInfo
    {
        private string m_name="";
        public string Name
        {
            get{return m_name;}
            set{m_name = value;}
        }
        private string m_code="";
        public string Code
        {
            get{return m_code;}
            set{m_code = value;}
        }
    }


    class Program
    {
        static void Main(string[] args)
        {
            Dictionary<string, CityInfo> arr = new Dictionary<string, CityInfo>();
            //城市信息,包括名称、区号、邮编、城市等级这几个属性
            CityInfo ci = new CityInfo();
            ci.Name = "成都";//从文本框读取的数据存入对应的城市信息
            ci.Code = "028";
            arr.Add("成都", ci);

            foreach (KeyValuePair<string, CityInfo> kvp in arr)
            {
                Console.WriteLine(kvp.Value.Code + kvp.Value.Name);
            }
            Console.Read();
        }
    }
}




 

posted @ 2009-08-13 14:33  GeneralXU  阅读(332)  评论(0编辑  收藏  举报