c# Dictionary从源码出发比较自定义对象

本文从一个项目实践出发,探讨了在C#中使用Dictionary时遇到的问题:当键为自定义对象时,即使对象内容相同,ContainsKey仍无法正确识别。通过对Dictionary的源码分析,揭示了哈希算法在处理哈希碰撞冲突时的机制——拉链法。文章还指出,由于默认的GethashCode方法可能导致相等对象的hashCode不同,因此需要重写GethashCode和Equals方法来确保正确的键值比较。最后,提供了相关学习资源链接。
摘要由CSDN通过智能技术生成

一、应用背景

项目中,需要将所有的计划信息加入服务器维护的静态字典对象中,key表示所有的计划信息,为自定义对象。value表示计划信息的状态,表示正在编辑或者完成。当用户每完成一条计划时,就会向服务器端发送计划信息。此时静态字典对象会判断新接收的信息是否已存在,如果没有,则加入字典中。

二、现象思考

使用Dictionary自带的函数ContainsKey比较时,会将所有的新对象都加入,即时自定义对象中各项的值都与字典中某一项相同,这是怎么回事呢?这时回到ContainsKey的源码思考了~
字典是如何对键值进行比较的呢?

三、理解hash算法

在字典的结构中,键和值是通过哈希表的方式存储的,但如果键/值很多的时候,使用哈希算法有可能会出现键/值的哈希码一致的情况。总结一下,hash中存在的情况:
1、同一个hash对象,hash码必定相同
2、不同的hash对象,hash码有可能相同

对于第二种情况,我们称为hash碰撞冲突,那在.Net中是如何解决碰撞冲突的呢?
拉链法:即出现hash冲突时,将冲突的元素都存在同一个链表上。上图:

这里写图片描述

字典中是如何使用哈希结构的呢?首先获得Key对象的一个hashCode,这个hashCode指向一个内存地址,用于存放键值。
现在理解就很容易了ÿ

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值