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

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

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/

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
 
© 2005- 王朝網路 版權所有 導航