Henry手记—.NET数据结构对象补遗之单链表(四)
韩睿 ( 06/15/2003)
3.10 其他属性
本文并没有全部实现所有的IList接口方法与属性的使用,但还是要声明出来如下四种属性。由于本文的单链表类没有提供内置的线程同步(都说完了,下次说什么呀。呵呵),因此IsSynchronized返回为false,SyncRoot返回的是类实例的引用。枚举数没有对集合的独占访问权;因此,枚举一个集合在本质上不是一个线程安全的过程。甚至在对集合进行同步处理时,其他线程仍可以修改该集合,这会导致枚举数引发异常。若要在枚举过程中保证线程安全,可以在整个枚举过程中用SyncLock锁定集合,或者捕捉由于其他线程进行的更改而引发的异常。象SSList类这样的处理,每一次锁定会阻塞全部对象,要提供粒度更小的线程安全,我们以后会继续讨论的。
Public Overridable ReadOnly Property IsSynchronized() As Boolean _
Implements IList.IsSynchronized
Get
Return False
End Get
End Property
Public Overridable ReadOnly Property SyncRoot() As Object _
Implements IList.SyncRoot
Get
Return Me
End Get
End Property
IsFixedSize属性是指通过类实现时,获取一个值,该值指示 IList 是否具有固定大小。链表类没有固定大小,所以返回的当然是false。
Public Overridable ReadOnly Property IsFixedSize() As Boolean _
Implements IList.IsFixedSize
Get
Return False
End Get
End Property
IsReadOnly属性是指通过类实现时,获取一个指示 IList 是否为只读的值。当然也是返回false喽。
Public Overridable ReadOnly Property IsReadOnly() As Boolean _
Implements IList.IsReadOnly
Get
Return False
End Get
End Property
4. 调用示例
在上面我们已经详细分析与列举了SSList类的实现,现在在来看一下它的结构,如图2所示:
图2 类结构(含两个嵌套类)
那么,怎么样来使用我们的单链表类呢?其实,很容易,与Arraylist类的使用方法相当相近,只是我们不用设定列表的长度而已,在另一个vb文件里,我们来对SLList类进行操作:
'使用示例
Dim lst As New SLList()
Try
lst.Add("Henry") '添加
lst.Add("jjj")
lst.Insert(1, "kkk") '插入
lst.Remove("jjj") '按值删除
lst.RemoveAt(1) '按索引号删除
lst(0) = "Jerry" '更改
Dim i As Integer = lst.IndexOf("jjj") '取索引号
'多种循环遍历
Dim collectionItem As Object
Dim loopCounter As Integer
Dim enumCollection As IEnumerator
'第一种
For Each collectionItem In lst
Console.WriteLine(collectionItem)
Next
'第二种
For loopCounter = 0 To lst.Count - 1
Console.WriteLine(lst.Item(loopCounter))
Next
'第三种
enumCollection = lst.GetEnumerator()
Do While enumCollection.MoveNext
Console.WriteLine(enumCollection.Current)
Loop
Catch ex As Exception
MsgBox(ex.ToString)
End Try
现在来看一下version的作用:
'第三种
enumCollection = lst.GetEnumerator()
lst.Add("Kelly")
Do While enumCollection.MoveNext
Console.WriteLine(enumCollection.Current)
Loop
这时您运行一下,就会得到一个异常,提示为:
System.InvalidOperationException: 该链表在枚举器创建后发生了改变
这不正是我们在VerifyListIsUnchanged方法中定义的出错信息吗?现在大家也就明白我们在操作Arraylist或其它.net类出错时,为什么会带有相应的提示文字了吧?象“索引越界”等我们定义过的出错提示在本例中也会被捕捉到。请自行测试。
5. 小结与展望
本文和大家一起深入collections集合类的实现,我们在实际工作中处理列表类时用的是Arraylist(我也是,呵呵)。但是链表的插入、删除的处理效率远高于ArrayList(单链表加上前驱指针会更加提高效率),当然,索引取值的能力不如ArrayList。我们在处理某些频繁删除与插入的列表时,还是值得考虑是否采用链表来实现我们的需求。
限于篇幅与时间,对于排序、同步等ArrayList具有的相应功能没有过多涉及,感兴趣的朋友请继续关注我的专栏。下次再见!
----
声明:本文版权与解释权归韩睿所有,如需转载,请保留完整的内容及此声明。
QQ: 18349592
E-Mail: henry7685@hotmail.com
请访问本人专栏:http://www.csdn.net/develop/author/netauthor/Latitude/