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

类别:.NET开发 点击:0 评论:0 推荐:

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

                            韩睿  ( 06/15/2003)

3.10      其他属性

本文并没有全部实现所有的IList接口方法与属性的使用,但还是要声明出来如下四种属性。由于本文的单链表类没有提供内置的线程同步(都说完了,下次说什么呀。呵呵),因此IsSynchronized返回为falseSyncRoot返回的是类实例的引用。枚举数没有对集合的独占访问权;因此,枚举一个集合在本质上不是一个线程安全的过程。甚至在对集合进行同步处理时,其他线程仍可以修改该集合,这会导致枚举数引发异常。若要在枚举过程中保证线程安全,可以在整个枚举过程中用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: [email protected]

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

本文地址:http://com.8s8s.com/it/it45577.htm