C#字典的使用方法是什么


这篇文章主要介绍“C#字典的使用方法是什么”,在日常操作中,相信很多人在C#字典的使用方法是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C#字典的使用方法是什么”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!字典表示一种复杂的数据结构,这种数据结构允许按照某个键来访问元素。字典也称为映射或散列表。
字典的主要特性是能根据键快速查找值。也可以自由添加和删除元素,这有点像List,但没有在内存中移动后续元素的性能开销。
下图是一个简化表示,键会转换位一个散列。利用散列创建一个数字,它将索引和值关联起来。然后索引包含一个到值的链接。一个索引项可以关联多个值,索引可以存储为一个树型结构。
.NET Framework提供了几个字典类。最主要的类是Dictionary用作字典中的键的类型必须重写Object类的GetHashCode()方法。只要字典类需要确定元素的位置,它就要调用GetHashCode()方法。GetHashCode()方法返回的int有字典用于计算在对应位置放置元素的索引。后面介绍这个算法,现在只需要知道它涉及素数,所以字典的容量是一个素数。
GetHashCode()方法的实现代码必须满足的要求:*相同的对象应总是返回相同的值*不同的对象可以返回相同的值*它应执行的比较快,计算的开销不大*它不能抛出异常*它应至少使用一个实例字段*散列代码值应平均分布在int可以存储的这个数字范围上*散列代码最好在对象的生存期中不发生变化字典的性能取决于GetHashCode()方法的实现代码。
散列代码值应平均分布在int可以存储的这个数字范围上的原因:
如果两个键返回的散列代码值会得到相同的索引,字典类就必须寻找最近的可用空闲位置来存储第二个数据项,这需要进行一定的搜索,以便以后检索这一项。显然这会降低性能,如果在排序的时候许多键都有相同的索引这中冲突会更可能出现。根据Microsoft的算法工作方式,当计算出来的散列代码值平均分布在int.MinValue和int.MaxValue之间时,这种风险会降到最低。
除了实现GetHashCode()方法之外,键类型还必须实现IEquatable.Equals()方法,或重写Object.Equals()方法。0因为不同的键对象可能返回相同的散列代码,所以字典使用Equals()方法来比较键。字典检查两个键A和B是否相等,并调用A.Equals(B)方法。这表示必须确保下述条件总是成立:
如果A.Equals(B)返回true,则A.GetHashCode(免费云主机域名)和B.GetHashCode()总是返回相同的散列代码。
这听起来有点奇怪,但它很重要。如果上述条件不成立,这个字典还能工作,但会出现,把一个对象放在字典中后,就再也检索不到它,或者返回了错误的项。
所以,如果为Equals()方法提供了重写版本,但没提供GetHashCode()方法的重写版本,C#编译器会显示一个警告。
对于System.Object,这个条件为true,因为Equals()方法只是比较引用,GetHashCode()方法实际上返回一个仅基于对象地址的散列代码。这说明,如果散列表基于一个键,而该键没有重写这些方法,这个散列表可以工作,但只有对象完全相同,键才被认为是相等的。也就是说,把一个对象放在字典中时,必须将它与该键的引用关联起来。也不能以后用相同的值实例化另一个键对象。如果没有重写Equals()方法和GetHashCode()方法,在字典中使用类型时就不太方便。
System.String实现了IEquatable接口,并重载了GetHashCode()方法。Equals()方法提供了值的比较,GetHashCode()方法根据字符串的值返回一个散列代码。因此,在字典中把字符串用在键很方便。
数字类型(如Int32)也实现了IEquatable接口,并重载了GetHashCode()方法。但是这些类型返回的散列代码只能映射到值上。如果希望用作键的数字本身没有分布在可能的整数值范围内,把整数用作键就不能满足键值的平均分布规则,于是不能获得最佳的性能。Int32并不适合在字典中使用。
如果需要使用的键类型没有实现IEquatable接口,并根据存储在字典中的键值重载GetHashCode()方法,就可以创建一个实现IEqualityComparer接口的比较器。IEqualityComparer接口定义了GetHashCode()方法和Equals()方法,并将传递的对象作为参数,这样可以提供与对象类型不同的实现方式。
创建一个员工ID(EmployeeId)结构,用作字典的键。存储在字典中的数据是Employee类型的对象。
该结构的成员是表示员工的一个前缀字符和一个数字。这两个变量都是只读的,只能在构造函数中初始化。字典中的键不应改变,这是必须保证的。 客户端代码:Dictionary类支持每个键关联一个值。Lookup类把键映射到一个值集上。这个类在程序集System.Core中实现,用System.Linq定义。
Lookup类不能像一般的字典那样创建,必须调用ToLookup()方法,该方法返回一个Lookup对象。ToLookup()方法是一个扩展方法,它可以用于实现了IEnumerable接口的所有类。
ToLookup()方法需要一个Func,Func定义了选择器。  
输出:SortedDictionary类是一个二叉搜索树,其中的元素根据键来排序。该键类型必须实现IComparable接口。
如果键的类型不能排序,还可以创建一个实现了IComparer接口的比较器,将比较器用作有序字典的构造函数的一个参数。
SortedDictionary和有序列表SortedList的区别:
*SortedList类使用的内存比SortedDictionary少。*SortedDictionary元素的插入和删除操作比较快。*在用已排序好的数据填充集合时,若不需要改变容量,ortedList比较快。到此,关于“C#字典的使用方法是什么”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注百云主机网站,小编会继续努力为大家带来更多实用的文章!

相关推荐: C#怎么使用Task实现并行编程

这篇文章主要介绍了C#怎么使用Task实现并行编程的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇C#怎么使用Task实现并行编程文章都会有所收获,下面我们一起来看看吧。用代码来说的话, 应该是这样:运行之后, 等待一会, 会看到如…

免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。

(0)
打赏 微信扫一扫 微信扫一扫
上一篇 04/16 11:04
下一篇 04/16 11:04

相关推荐