程序每次向容器Dictionary中插入数据时,都会判断Key值是否已经存在,如果不存在,则插入。否则抛出异常。那么Dictionary又是如何判断Key值是否存在的呢? 请看下面的代码:

 
class Program
    {
        static void Main(string[] args)
        {
            var dic = new Dictionary<Person, int>();
            dic.Add(new Person {Name = "ABC", Age = 18}, 1);
            dic.Add(new Person { Name = "Captain", Age = 24 }, 1);
            dic.Add(new Person { Name = "Knee", Age = 28 }, 1);
            dic.Add(new Person { Name = "Knee", Age = 28 }, 2);
 
            foreach (var item in dic)
            {
                Console.WriteLine(string.Format("{0},{1}", item.Key.Name, item.Key.Age));
            }
 
            Console.ReadKey();
        }
    }
 
    public class Person
    {
        public string Name { get; set; }
 
        public int Age { get; set; }
 
        public override bool Equals(object obj)
        {
            if (!(obj is Person))
            {
                return false;
            }
            var p = (Person) obj;
            Console.WriteLine(string.Format("Equals{0}", p.Name));
            return this.Name == p.Name && this.Age == p.Age;
        }
 
        public override int GetHashCode()
        {
            Console.WriteLine(string.Format("GetHashCode{0}", this.Name));
            return Name.GetHashCode() + Age*37;
        }
    }
 
 
 
从程序运行的结果可以看出,程序每次向Dictionary插入数据的时候,都会调用对象的GetHashCode方法,当得到的值在Dictionary中没有时,就会向Dictionary中插入数据。当第四条数据插入时,程序检测到Dictionary中已经存在了同样的Hash值,它会继续去比较对象的Equals方法,发现对象一致之后,程序抛出异常。
 
总结:Dictionary插入对象时,会先根据Key的GetHashCode方法来判断是否存在,如果已经存在该HashCode的数据,会继续比较对象的Equals方法,如果Equals方法返回true,说明两个对象一致,不予以插入。反之,则可插。

C#基础 Dictionary存储自定义对象作为键值的更多相关文章

  1. Java基础知识强化之集合框架笔记46:Set集合之TreeSet存储自定义对象并遍历练习2(自然排序:Comparable)

    1. TreeSet存储自定义对象并遍历练习2: (1)Student.java package cn.itcast_06; /* * 如果一个类的元素要想能够进行自然排序,就必须实现自然排序接口 * ...

  2. Java基础知识强化之集合框架笔记45:Set集合之TreeSet存储自定义对象并遍历练习1(自然排序:Comparable)

    1. 自然排序: TreeSet会调用集合元素的compareTo(Object obj)方法来比较元素之间的大小关系,然后将集合元素按照升序排列,这种方式就是自然排序. Java中提供了一个Comp ...

  3. Java基础知识强化之集合框架笔记41:Set集合之HashSet存储自定义对象并遍历练习

    1. HashSet集合存储自定义对象并遍历.如果对象的成员变量值相同即为同一个对象 注意了: 你使用的是HashSet集合,这个集合的底层是哈希表结构. 而哈希表结构底层依赖:hashCode()和 ...

  4. Java基础知识强化之集合框架笔记40:Set集合之HashSet存储自定义对象并遍历

    1. HashSet存储自定义对象并遍历 2. 代码示例: (1)Student类,如下: package cn.itcast_02; /** * @author Administrator * */ ...

  5. Java基础知识强化之集合框架笔记24:ArrayList存储自定义对象并遍历

    1. ArrayList存储自定义对象并遍历 2. 代码示例: Student.java,如下: package cn.itcast_01; public class Student { privat ...

  6. MySQL基础day03 存储引擎和外键MySQL 5.6

    MySQL基础day03_存储引擎和外键-MySQL 5.6 外键的条件: 1,表的存储引擎为innodb存储引擎 2,表中外键字段的类型要与参考表的字段类型一致 3,外键字段要是索引类型中的一种 M ...

  7. NSUserDefaults 简介,使用 NSUserDefaults 存储自定义对象

    摘要: NSUserDefaults适合存储轻量级的本地数据,一些简单的数据(NSString类型的)例如密码,网址等,NSUserDefaults肯定是首选,但是如果我们自定义了一个对象,对象保存的 ...

  8. java 16 -11 ArrayList存储自定义对象并增强for遍历

    需求:ArrayList存储自定义对象并遍历.要求加入泛型,并用增强for遍历. A:迭代器 B:普通for     C:增强for LinkedList,Vector,Colleciton,List ...

  9. 在配置文件(.settings、.config)中存储自定义对象

    原文:在配置文件(.settings..config)中存储自定义对象 引言 我前面曾写过一篇<使用配置文件(.settings..config)存储应用程序配置>,我在其中指出“sett ...

随机推荐

  1. CF #Manthan, Codefest 16 C. Spy Syndrome 2 Trie

    题目链接:http://codeforces.com/problemset/problem/633/C 大意就是给个字典和一个字符串,求一个用字典中的单词恰好构成字符串的匹配. 比赛的时候是用AC自动 ...

  2. css 画出三角形

    技术分享不一定行文累赘 这里说说最简洁的 css 画出三角形 display: inline-block; border: 10px dashed transparent; border-left: ...

  3. poj2104 Kth-Number

    Description You are working for Macrohard company in data structures department. After failing your ...

  4. tomcat 下部署单框架cas时,报出org.apache.jasper.JasperException异常的解决办法

    在tomcat中部署好cas server(设置好https,将cas.war拷贝到了webapps下部署完成),启动tomcat后,访问http://localhost:8443/cas/login ...

  5. JQuery简单动画效果的发生顺序和animate方法

    (1)在同一组元素上的效果 当在一个.animate()方法中以多个属性的方式应用时,是同时发生的. 当以方法连缀的形式应用时,是按顺序发生的(排队效果)---除非queue选项值为false. (2 ...

  6. Less与Sass

    less 1.变量    声明变量:@变量名:变量值 使用变量:@变量名 >>>Less中变量的类型 ①数字类:1 100px ②字符串:无引号字符串[red] 有引号字符串[&qu ...

  7. 为RecyclerView的item之间设置相同的间距

    项目中经常碰到列表当中的每一项之间需要设置间距的问题,我们可以通过给列表中的每一项设置margin值来实现,例如纵向的间距可以给每一项设置right_margin,这种方法下,整个列表的最左边会紧贴屏 ...

  8. 七牛整合 ueditor (拦住那头牛,七牛又如何)

    最近遇到个项目,要求所有图片都必须整合到七牛上,看了把你谈文档踩在前辈们的基础上终于把他完成了,恰巧本屌丝最近刚好有时间,本着天下屌丝是一家的原则,和小朋友们一同学习 闲话少说入正题. 第一 :下载编 ...

  9. 利用JavaScript数组动态写入HTML数据节点

    如果想要使用数组来写入HTML数据,绝对需要的是一个Key值,由Key来引导遍历数组各项:此外,使用DOM原生方法写入文档,用同一个CSS样式渲染它们,这样可以极大地减少开发时间和减少维护成本,此方法 ...

  10. sublime比较好用的插件

    emmet, markdown preview, package Control, SFTP, Anaconda