Vb.net 集合与集合之间的差异<;T>;和自定义实现类

Vb.net 集合与集合之间的差异<;T>;和自定义实现类,vb.net,Vb.net,有些人建议从集合继承以获得集合类。其他一些人建议从头开始创建类和实现接口。我想知道什么时候使用一个而不是另一个 我看到当我使用: class MyCollection Inherits Collection(Of SomeObject) 我可以为每个etc添加、插入,这可能是因为集合在内部使用列表 但是,如果我这样做: class MyCollection : IList(Of SomeObject), IEnumerable<SomeObject>, IEnume

有些人建议从集合继承以获得集合类。其他一些人建议从头开始创建类和实现接口。我想知道什么时候使用一个而不是另一个

我看到当我使用:

class MyCollection 
       Inherits Collection(Of SomeObject)
我可以为每个etc添加、插入,这可能是因为
集合在内部使用列表

但是,如果我这样做:

class MyCollection : IList(Of SomeObject), IEnumerable<SomeObject>, IEnumerable(Of SomeObject)
          myList As List(Of SomeObject)

下面是一个自定义集合的示例,它实现了
collection(of T)
,然后添加了自己的
Sort
方法:

Public Class StringCollection
    Inherits Collection(Of String)

    Public Sub Sort()
        Dim allItems = Items.ToArray()

        Array.Sort(allItems)

        For i = 0 To allItems.GetUpperBound(0)
            Items(i) = allItems(i)
        Next
    End Sub

End Class
示例用法:

Dim strings As New StringCollection

strings.Add("Peter")
strings.Add("Paul")
strings.Add("Mary")

strings.Sort()

For Each s In strings
    Console.WriteLine(s)
Next
Dim strings As New StringCollection

strings.Add("Peter")
strings.Add("Paul")
strings.Add("Mary")

strings.Sort(Function(a, b) a.Length.CompareTo(b.Length))

For Each s In strings
    Console.WriteLine(s)
Next
Dim strings As New StringCollection

strings.Add("Peter")
strings.Add("Paul")
strings.Add("Mary")

Dim comparer As New StringLengthComparer

strings.Sort(comparer)

For Each s In strings
    Console.WriteLine(s)
Next
Sort
方法依赖于项本身的
IComparable
实现。如果您想支持其他排序方法,或者您的项目没有实现
i可比较
,那么您可以实现不同的
排序
方法,例如

Public Class StringCollection
    Inherits Collection(Of String)

    Public Sub Sort()
        Dim allItems = Items.ToArray()

        Array.Sort(allItems)

        For i = 0 To allItems.GetUpperBound(0)
            Items(i) = allItems(i)
        Next
    End Sub

    Public Sub Sort(comparison As Comparison(Of String))
        Dim allItems = Items.ToArray()

        Array.Sort(allItems, comparison)

        For i = 0 To allItems.GetUpperBound(0)
            Items(i) = allItems(i)
        Next
    End Sub

End Class
示例用法:

Dim strings As New StringCollection

strings.Add("Peter")
strings.Add("Paul")
strings.Add("Mary")

strings.Sort()

For Each s In strings
    Console.WriteLine(s)
Next
Dim strings As New StringCollection

strings.Add("Peter")
strings.Add("Paul")
strings.Add("Mary")

strings.Sort(Function(a, b) a.Length.CompareTo(b.Length))

For Each s In strings
    Console.WriteLine(s)
Next
Dim strings As New StringCollection

strings.Add("Peter")
strings.Add("Paul")
strings.Add("Mary")

Dim comparer As New StringLengthComparer

strings.Sort(comparer)

For Each s In strings
    Console.WriteLine(s)
Next
在这种情况下,我们显式地比较
字符串
项的
长度
,而不是隐式的“字母”
i可比较
实现

您可以为每个相关的
数组重载包含
Sort
重载。Sort
和/或您可以根据需要提供自己的显式比较。请注意,其中一个重载采用
IComparer
。以下是您可以如何利用它:

Public Class StringCollection
    Inherits Collection(Of String)

    Public Sub Sort()
        Dim allItems = Items.ToArray()

        Array.Sort(allItems)

        For i = 0 To allItems.GetUpperBound(0)
            Items(i) = allItems(i)
        Next
    End Sub

    Public Sub Sort(comparison As Comparison(Of String))
        Dim allItems = Items.ToArray()

        Array.Sort(allItems, comparison)

        For i = 0 To allItems.GetUpperBound(0)
            Items(i) = allItems(i)
        Next
    End Sub

    Public Sub Sort(comparer As IComparer(Of String))
        Dim allItems = Items.ToArray()

        Array.Sort(allItems, comparer)

        For i = 0 To allItems.GetUpperBound(0)
            Items(i) = allItems(i)
        Next
    End Sub

End Class
下面是一个比较器示例:

Public Class StringLengthComparer
    Implements IComparer, IComparer(Of String)

    Public Function Compare(x As Object, y As Object) As Integer Implements IComparer.Compare
        Return Compare(CStr(x), CStr(y))
    End Function

    Public Function Compare(x As String, y As String) As Integer Implements IComparer(Of String).Compare
        Return x.Length.CompareTo(y.Length)
    End Function

End Class
示例用法:

Dim strings As New StringCollection

strings.Add("Peter")
strings.Add("Paul")
strings.Add("Mary")

strings.Sort()

For Each s In strings
    Console.WriteLine(s)
Next
Dim strings As New StringCollection

strings.Add("Peter")
strings.Add("Paul")
strings.Add("Mary")

strings.Sort(Function(a, b) a.Length.CompareTo(b.Length))

For Each s In strings
    Console.WriteLine(s)
Next
Dim strings As New StringCollection

strings.Add("Peter")
strings.Add("Paul")
strings.Add("Mary")

Dim comparer As New StringLengthComparer

strings.Sort(comparer)

For Each s In strings
    Console.WriteLine(s)
Next

我们再次按照项目的
长度对项目进行排序,但这次,我们使用了一个实现
IComparer
的对象来进行比较,而不是
比较(T)
委托。不过,您应该注意到,最后一个示例中的
IComparer
方法的
Compare
形式与前一个示例中用于创建
Comparison(of T)
委托的Lambda形式几乎完全相同。

如果您自己实现所有这些接口,那么您只需要复制
集合(T)
已经为你做了。如果你想要一个实现
IList(Of T)
的类,那么不继承
Collection(Of T)
是没有意义的,除非你真的喜欢浪费时间重新发明轮子。如果你只想实现
IEnumerable(Of T)
ICollection(Of T)
那就不同了。@jmchilinney我看到从集合继承缺少排序。我应该从集合继承并实现我的可比性吗?这并不是说它“缺少”了一个
Sort
方法,因为
Sort
不是一个标准方法,也就是说,它不是
IList(of t)的成员
接口。如果您想要一个
排序
方法,那么您可以很容易地添加一个方法。您绝对不应该实现
IComparable
。您这样做是为了集合项,而不是集合。您想能够将一个集合与另一个集合进行比较吗。读取。@jmchinney I ment实现(某个对象的)IComparaer但是当我实现公共函数Compare(x为Merge,y为Merge)时,作为Integer的函数实现了IComparer(Of Merge)对于我的收藏。什么启用排序?你也不会实现
IComparer
。这是针对传递给
Sort
方法的对象,专门用于比较某一类型的项目。我在我指导你的博客文章中解释了所有这些,因此我建议你阅读它。首先,你犯了一个错误,没有做我在我的代码。然后,你不必费心重新阅读我的代码来检查是否正确,并要求我浪费更多的时间告诉你阅读我已经发布的内容。这不是交朋友的方式。我明白了,所以我需要在单独的类或类合并本身中实现Comparer-意味着不在集合类本身中。以及在集合类本身中,只是创建方法/-s来调用比较器,对吗?现在请看编辑部分,现在应该可以了。您能确认吗?