程序每次向容器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. 各种API总结大全 JAVA、HTML、HTML5等等

    本文章,发现新的API会进行更新,如果你们觉得有新的版本或者拥有新的,也可以发有邮箱到"zenglei8732@163.com"当中,本人会在12小时内更新,非常感谢!!! HTM ...

  2. 区分词法作用域(js)与动态作用域(精!)

    在js学习中,词法作用域是必须要掌握的! 在这里,我将总结一下<你不知道的JS>一书中词法作用域的重点并分享给大家! 首先带来一段代码示例: function foo(){ console ...

  3. UPYUN云服务体验计划,阅读神器Kindle、LaCie移动硬盘、索尼大法充电宝、高大上极路由、UPYUN代金券等你拿!

    请看以下的“通关攻略”,分享你对云服务的“体验心得”,即可赢取绝佳的“通关宝藏”,阅读神器Kindle.LaCie移动硬盘.索尼大法充电宝.高大上极路由.UPYUN代金券等你拿!先来了解下UPYUN能 ...

  4. [工具技巧] SecureCRT使用技巧 V1.0

    本文档适用对象为需要使用secureCRT做系统或网络等调试的工程师,其必须有用过该款软件,基础功能会使用.对于那些需要修改大量设备的配置时像远程升级等等,更应该学习本文档. 1       Secu ...

  5. 最长递增子序列hdu1087

    #include<map> #include<set> #include<list> #include<cmath> #include<queue ...

  6. poj2349,最小生成树!

    The Department of National Defence (DND) wishes to connect several northern outposts by a wireless n ...

  7. 关于制作C语言头文件的思考

    我们接触的第一个c语言代码是这个: #include<stdio.h> main() { printf("Hello World"); } 这是最简单的c代码,然而,它 ...

  8. php函数的种类与调用方法大揭密

    PHP中的函数看上去很简单,实际上功能非常强大,我这里按函数名称是否固定,可以分为以下三大类: 一.名称固定的函数: 这类函数,也叫:常规函数,直接用关键字function来创建,也是大家最熟悉的类型 ...

  9. LeetCode5. Longest Palindromic Substring 最长回文子串 4种方法

    题目链接:https://leetcode.com/problems/longest-palindromic-substring/ 题意很简单,就是求一个字符串得最长子串,这里的子串指连续的. 本文给 ...

  10. sqlmap连接Mysql实现getshell(原创)

    前言 昨天群友发了一知乎的帖子..才发现sqlmap玩了那么久有些玩意我居然没玩过...然后看着群友玩= =今天也想试试. 0x01 首先得知道这个玩意,sqlmap -help,不说大家也懂搜嘎. ...