分享
 
 
 

Henry手记—.NET数据结构对象补遗之单链表(三)

王朝c#·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

Henry手记—.NET数据结构对象补遗之单链表(三)

韩睿 ( 06/15/2003)

3.8 Item属性

Item属性提供给VB.NET按list(2)这样的方式操作列表,也就能赋予单链表和ArrayList数组一样的索引方式,尽管在实现上效率不如数组,但这样方便的操作手段我们不能放过:

Default Public Overridable Property Item( _

ByVal index As Integer) As Object Implements IList.Item

'Item属性,读写链表的索引处结点的数据值

Get

Validate(index)

Return FindByIndex(index).Data

End Get

Set(ByVal Value As Object)

Validate(index, Value)

FindByIndex(index).Data = Value

End Set

End Property

同样的,我们还提供计数功能,利用的就是上述各种操作中都在进行更改的nodeCount成员。

Public Overridable ReadOnly Property Count() As Integer _

Implements IList.Count

'返回链表元素总数

Get

Return nodeCount

End Get

End Property

到这里,我们是不是已经实现了基本的链表操作功能了?但是,还有一些重要机制并没有揭示给读者朋友,让我们继续吧。

3.9 For Each循环枚举的实现

For Each是个很强大的遍历方法,要实现这个功能,链表类必须实现IEnumerable接口,在IList我们通过实现继承自IEnumerable的GetEnumerator函数来达到这一目标。但该函数返回的是IEnumerator枚举器类型,因此我们要实现自己的枚举器来达到对链表的处理:

IEnumerator 是所有枚举数的基接口。枚举数只允许读取集合中的数据。枚举数无法用于修改基础集合。IEnumerator接口支持两种方法和一个属性。MoveNext方法能在集合中一次移动一条记录。Reset方法能使枚举器复位到集合的起始。Current只读属性能从集合返回当前记录。

最初,枚举数被定位于集合中第一个元素的前面。Reset 也将枚举数返回到此位置。在此位置,调用 Current 会引发异常。因此,在读取 Current 的值之前,必须调用 MoveNext 将枚举数提前到集合的第一个元素。

在调用 MoveNext 或 Reset 之前,Current 返回同一对象。MoveNext 将 Current 设置为下一个元素。

在传递到集合的末尾之后,枚举数放在集合中最后一个元素后面,且调用 MoveNext 会返回 false。如果最后一次调用 MoveNext 返回 false,则调用 Current 会引发异常。若要再次将 Current 设置为集合的第一个元素,可以调用 Reset,然后再调用 MoveNext。

只要集合保持不变,枚举数就保持有效。如果对集合进行了更改(例如添加、修改或删除元素),则该枚举数将失效且不可恢复,并且下一次对 MoveNext 或 Reset 的调用将引发 InvalidOperationException。如果在 MoveNext 和 Current 之间修改集合,那么即使枚举数已经无效,Current 也将返回它所设置成的元素。现在您就会理解我们在前面不断看到的那个version的用法了。

由于我们在之前把ListNode定义为嵌套类,同时需要调用SLList类的成员,所以把自定义的实现IEnumerator接口的类置入SLList类中,成为第二个嵌套类:

Public Overridable Function GetEnumerator() As IEnumerator _

Implements IList.GetEnumerator

Return New SLListEnumerator(Me)

End Function

下面就是实现IEnumerator接口的类了。

Protected Class SLListEnumerator

Implements IEnumerator

'嵌套在SLList内部的计数器类

Protected list As SLList

Protected currentElement As Object

Protected currentNode As ListNode '嵌套在内部才可以使用这个类

Protected version As Integer '内部版本记录,用于比对链表是否已有改变

Public Sub New(ByVal list As SLList)

'初始化

Me.list = list

Me.version = list.version

Me.currentElement = list

Me.currentNode = list.head

End Sub

Protected Overridable Sub VerifyListIsUnchanged()

'判断版本是否在枚举器创建后还发生了改变

If Not version = list.version Then

Throw New InvalidOperationException( _

"该链表在枚举器创建后发生了改变")

End If

End Sub

Public Overridable ReadOnly Property Current() As Object _

Implements IEnumerator.Current

'返回当前记录

Get

'判断是否已经到了链表尾或是否调用了MoveNext查找记录

If currentElement Is list Then

If currentNode Is list.head Then

Throw New InvalidOperationException( _

"Current方法在MoveNext被调用前是无效的.")

Else

Throw New InvalidOperationException( _

"已到达集合尾,因此Current方法无效")

End If

End If

Return currentElement

End Get

End Property

Public Overridable Function MoveNext() As Boolean _

Implements IEnumerator.MoveNext

'将枚举器继续移到下一个对象

VerifyListIsUnchanged()

If Not currentNode.NextNode Is Nothing Then

currentNode = currentNode.NextNode

currentElement = currentNode.Data

Return True

Else

currentElement = list

currentNode = list.head

Return False

End If

End Function

Public Overridable Sub Reset() Implements IEnumerator.Reset

'将枚举器重置为其初始位置

VerifyListIsUnchanged()

currentNode = list.head

currentElement = list

End Sub

End Class

----

声明:本文版权与解释权归韩睿所有,如需转载,请保留完整的内容及此声明。

QQ: 18349592

E-Mail: henry7685@hotmail.com

请访问本人专栏:http://www.csdn.net/develop/author/netauthor/Latitude/

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有