现在的位置: 首页 > 综合 > 正文

Dictionary入门

2013年10月11日 ⁄ 综合 ⁄ 共 2877字 ⁄ 字号 评论关闭

Dictionary入门
(1).Dictionary支持泛型,速度快,类型安全,不用担心装箱与拆箱带来的性能损耗,Hashtable不支持泛型;
(2).Dictionary <TKey,TValue>一出Hashtable就被淘汰了...你说哪个性能高?
(3).Hashtable里存的对象全部是object类型,所有对象存进去都被转成object类型,读取出来每次都需要转换类型,Hashtable对存入的类型没有限制,因此在读取转换类型时容易出错;
Dictionary只能存入定义时指定的类型,而且不像Hashtable会把类型转换成object,存取起来比前者方便,效率更高,因为不需要转换类型,所以不会出现Hashtable里的转换类型错误而报出程序异常;
(4).由于 Hashtable 和 Dictionary 同时存在, 在使用场景上必然存在选择性,并不任何时刻都能相互替代。
    [1] 单线程程序中推荐使用 Dictionary, 有泛型优势, 且读取速度较快, 容量利用更充分。
    [2] 多线程程序中推荐使用 Hashtable, 默认的 Hashtable 允许单线程写入, 多线程读取, 对 Hashtable 进一步调用 Synchronized() 方法可以获得完全线程安全的类型。 而 Dictionary 非线程安全, 必须人为使用 lock 语句进行保护, 效率大减。
    [3] Dictionary 有按插入顺序排列数据的特性 (注: 但当调用 Remove() 删除过节点后顺序被打乱), 因此在需要体现顺序的情境中使用 Dictionary 能获得一定方便。

public static void RunSnippet()
        {
            System.Collections.Generic.Dictionary<PointItem,int> dicPoint=new System.Collections.Generic.Dictionary<PointItem,int>();
            dicPoint.Add(PointItem.UNewAccount,50);
            dicPoint.Add(PointItem.ULogin,20);
            //dicPoint.Add(PointItem.ULogin,88);//异常: System.ArgumentException: 已添加了具有相同键的项。
            //修改值或添加值(不存在则添加)
            dicPoint[PointItem.ULogin]=88;
            dicPoint[PointItem.QCommentAnswer]=99;
            //用KeyValuePair遍历
            foreach(System.Collections.Generic.KeyValuePair<PointItem,int> ii in dicPoint)
                Console.WriteLine(string.Format("{0},{1}",ii.Key,ii.Value));
            Console.WriteLine("--------------------");
            //ContainsKey
            Console.WriteLine(dicPoint.ContainsKey(PointItem.QPutKnow));//Flase
            //Console.WriteLine(dicPoint[PointItem.QPutKnow]);//异常:System.Collections.Generic.KeyNotFoundException: 给定关键字不在字典中。
            //ContainsKey
            if(dicPoint.ContainsKey(PointItem.QPutKnow))
                Console.WriteLine(dicPoint[PointItem.QPutKnow]);
            //TryGetValue
            int iValue=0;
            if(dicPoint.TryGetValue(PointItem.QDeleteQuestion,out iValue))
                Console.WriteLine(iValue);
            else
                Console.WriteLine("PointItem.QDeleteQuestion 没有值");
            //ValueCollection
            System.Collections.Generic.Dictionary<PointItem,int>.ValueCollection valueColl=dicPoint.Values;
            foreach(int i in valueColl)
                Console.Write(string.Format("{0}/t",i));
            Console.WriteLine();
            //KeyCollection
            System.Collections.Generic.Dictionary<PointItem,int>.KeyCollection keyColl=dicPoint.Keys;
            foreach(PointItem pi in keyColl)
                Console.Write(string.Format("{0}/t",pi));
            Console.WriteLine();
            //Remove
            bool removeSuccess = dicPoint.Remove(PointItem.QPutQuestion);//不存在则False
            Console.WriteLine(removeSuccess);
        }

public enum PointItem
    {
        UNewAccount,
        ULogin,
        QPutQuestion,
        QAcceptAnswer,
        QCommentAnswer,
        AAnswer,
        ABestAnswer,
        QPutKnow,
        ACommentKnow,
        QQuestionOver,
        QDeleteQuestion
    };

抱歉!评论已关闭.