注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

信息 灵感 创新

I? =Information,Inspiration,Innovation

 
 
 

日志

 
 
关于我

we are 5. Mathematics, Computation, Programming, Engineering, and Making fun of life.

网易考拉推荐

数组、索引器和集合(十二)  

2010-12-28 11:05:27|  分类: C# & .NET |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

字典

字典(Dictionary)表示一种非常复杂的数据结构,这种数据结构允许按照某个键来访问元素,这和我们常见的字典将词与定义结合起来一样,字典也称为映射或散列表。字典的主要特性是能根据键快速查找值。也可以自由添加和删除元素,这有点像List<T>,但没有在内存中移动后续元素的性能开销。

下图是一个字典的简化表示,其中的学号(例如2010003)是添加到字典中的键,键会转化为一个散列,利用散列创建一个数字,它将索引和值关联起来。然后索引包含一个到值的链接。该图做了简化处理,因为一个索引项可以关联多个值,索引可以存储为一个树形结构。

数组、索引器和集合(十二) - Castor - 趁年轻,多折腾~~

.NET Framework 提供了几个字典类。其中最常用的类是Dictionary<TKey, TValue>。这个类的属性和方法与前面的有序表SortedList<TKey, TValue>几乎完全相同。

键的类型

用作字典中键的类型必须重写Object 类的GetHashCode()方法。只要字典类需要确定元素的位置,就要调用GetHashCode()方法。GetHashCode()方法返回的int 由字典用于计算放置元素的索引,它涉及到素数,所以字典的容量总是一个素数。

字典的性能取决于 GetHashCode()方法的实现代码,GetHashCode()方法的实现代码必须满足如下要求:

相同的对象应总是返回相同的值。

不同的对象可以返回相同的值。

应执行得比较快,计算的开销不大。

不能抛出异常。

应至少使用一个实例字段。

散列码值应平均分布在int 可以存储的整个数字区域上。

散列码最好在对象的生存期中不发生变化。

除了实现GetHashCode()方法之外,键类型还必须执行IEquality.Equals()方法,或重写Object 类的Equals()方法。因为不同的键对象可能返回相同的散列码,所以字典使用Equals()方法来比较键。字典检查两个键A B 是否相等,并调用A.Equals(B)。这表示必须确保下述条件总是成立:

如果 A.Equals(B)返回true,则A.GetHashCode()B.GetHashCode()必须总是返回相同的散列码

如果设计出某种重写这些方法的方式,使上面的条件并不总是成立,把这个类的实例用作键的字典就不能正常工作。例如,把一个对象放在字典中后,就再也找不到它,或者试图查找某项,却返回了错误的项,因此,如果为Equals()方法提供了重写版本,但没有提供GetHashCode()的重写版本,C#编译器就会显示一个编译警告,大多数情况下,可以直接使用从Object类的继承实现。

字典的方法或属性

方法或属性

说明

Count

获取字典中元素数目

Item

索引器,用[]实现

Keys

获取包含字典中键的集合

Values

获取包含字典中值的集合

Add()

添加指定键和值的项

Clear()

删除字典中所有元素

ContainsKey()

确定字典是否有特定键

ContainsValue()

确定字典是否有特定值

GetEnumerator

返回字典的枚举器

GetObjectData()

实现ISerializable并返回序列化字典所需的数据

Remove()

删除指定Key的一项

 
  评论这张
 
阅读(470)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2016