程序每次向容器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. Lucene工作原理

    Lucene是一个高性能的java全文检索工具包,它使用的是倒排文件索引结构.该结构及相应的生成算法如下: 0)设有两篇文章1和2 文章1的内容为:Tom lives in Guangzhou,I l ...

  2. 初学T4模板

    1.T4模板语法 <#@ template language="C#v3.5" hostSpecific="true" debug="true& ...

  3. 发送验证码(××s后重新发送)

    html: <input class="tel" type="text" name="tel" placeholder="手 ...

  4. struts2标签库----控制标签详解

         前面几篇文章我们介绍了有关struts2的基本内容,简单理解了整个框架的运作流程.从本篇开始我们逐渐了解和使用struts2为我们提供的标签库技术,使用这些标签可以大大降低我们表现层的开发难 ...

  5. 最大流算法之Dinic

    引言: 在最大流(一)中我们讨论了关于EK算法的原理与代码实现,此文将讨论与EK算法同级别复杂度(O(N^2M))的算法--Dinic算法. Dinic算法用到的思想是图的分层结构,通过BFS将每一个 ...

  6. MapControl Application 添加自定义的工具条

    现在想用二次开发做一些东西,然后需要自定义的工具条,但是如何向MapControl Application 添加自定义的工具条呢,经过多次试验后,终于找到了相应的方法(左图是添加自定义的工具条之前,右 ...

  7. java集合系列—ArrayList

    ArrayList是工作以来使用频率最高的集合类.以前上课老师说不知道用什么集合类就用ArrayList,好吧,后面就这样了. public class ArrayList<E> exte ...

  8. 盘点国内外那些有野心的BI公司

    在当前BI商业智能市场打开并被广泛应用的背景下,国内外涌现出一大批优秀的BI产品.当然好的BI产品一定离不开好的BI公司,在最新发布的Gartner 2017 年<商业智能和分析平台魔力象限&g ...

  9. python中从文件中读取数据2

    #average7.py 文件中有多行,且每行有多个数字用逗号隔开 def main(): fileName = input("What file are numbers in?" ...

  10. java之反射

    初学反射,也是第二次写博客了把,就简单记录一下. Reflection(反射)是被视为动态语言的关键,反射机制允许程序在执行期借助于Reflection API取得任何类的内部信息,并能直接操作任意对 ...