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来调用比较器,对吗?现在请看编辑部分,现在应该可以了。您能确认吗?