• 范型编程系列三:泛型集合类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();
            }
        }
    }




     

  • 相关阅读:
    eclipse 粘贴字符串自动添加转义符
    原创 导出微信收藏到电脑
    解决 eclipse中properties文件编码问题
    jetty 内嵌服务
    解决log4j:WARN No appenders could be found for logger
    解决JettyMavenPlugin: Failed to load class "org.slf4j.impl.StaticLoggerBinder"
    读取properties文件方式
    解决ssh远程登陆linux显示-bash-4.1$
    解决weblogic.net.http.SOAPHttpsURLConnection incompatible with javax.net.ssl.HttpsURLConnection
    解决java.io.IOException: HTTPS hostname wrong: should be
  • 原文地址:https://www.cnblogs.com/GeneralXU/p/1545272.html
Copyright © 2020-2023  润新知