0

有些人建议从 Collection 继承来获取集合类。其他一些人建议从头开始创建类和实现接口。我想了解何时使用一个而不是另一个。

我看到当我使用时:

class MyCollection 
       Inherits Collection(Of SomeObject)

我有可能为每个等添加,插入,这可能是因为Collection<T> uses internally List<T>

但是,如果我只是这样做:

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

我也可以实现这样的事情Add(), Remove(), for each

使用 Collection(Of T) 是不是很好,因为它已经包含所有这些实现的接口和内部 List(Of T) 而不是自己在 self 类中从头开始实现所有接口?这是人们建议继承的重点COllection(Of T)吗?

编辑(进一步讨论):

  Public Class Merge
        Property Size As Integer
        Property Datee As Date
        Property Min As Integer
        Property Max As Integer?
        Property Value As Double

        Public Sub New(min As Integer, max As Integer?, value As Integer)
            Me.Min = min
            Me.Max = max
            Me.Value = value
        End Sub      
    End Class

    Public Enum SortCriteria
        MinThenMax
        MaxThenMin
    End Enum

  Public Class MergeComparer
        Implements IComparer(Of Merge)   'do oddzielnej klasy sortowania obiektu jak tutaj potrzebujemy IComparer a nie IComparable (ten jest bezposrednio na klasie)

        Public SortBy As SortCriteria = SortCriteria.MinThenMax

        Public Function Compare(x As Merge, y As Merge) As Integer Implements IComparer(Of Merge).Compare
        'to be implemented
        End Function


    End Class


      Public Class MergeCollection
      Inherits Collection(Of Merge)

    Public SortBy As SortCriteria = SortCriteria.MinThenMax


    ''' <summary>
    ''' Ovveride because
    ''' There could be only one item on list which contains Max prop = Nothing
    ''' </summary>
    ''' <param name="index"></param>
    ''' <param name="item"></param>
    Protected Overrides Sub InsertItem(index As Integer, item As Merge)
        if IsNothing(item.Max)
            If Items.Any(Function(myObject) IsNothing(Items.Max)) Then
                Return
            End If
        End If

        MyBase.InsertItem(index, item)
    End Sub   

    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 Merge))
        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 Merge))
        Dim allItems = Items.ToArray()

        Array.Sort(allItems, comparer)

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

End Class
4

1 回答 1

1

这是一个自定义集合的示例,它实现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

Sort方法依赖于IComparable项目本身的实现。如果您想支持其他排序方法或者您的项目没有实现IComparable,那么您可以实现不同的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

    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(Function(a, b) a.Length.CompareTo(b.Length))

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

在这种情况下,我们通过项目而不是隐含的“字母”实现来明确比较String项目。LengthIComparable

您可以Sort为每个相关的重载包含一个重载Array.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")

Dim comparer As New StringLengthComparer

strings.Sort(comparer)

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

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

于 2018-12-18T10:09:46.310 回答