2015-09-19 44 views
1

我需要的是像实现集合的泛型集合有两种类型的类点网限制 - 入门

我就不细说了在这四个类别的命名空间( System.CollectionsCollections.Generic.Specialized.Concurrent),但类
SortedCollection(Of TKey As IComparable, TValue) 

这显然是一个通用的,寻找相同SortedList,但是,随着SortedList不同的是,虽然TValue声明同样的方式,SortedListKeyPair(TKey, TValue)。我们需要的是TValue是一个KeyPair(TKey, List(Of TValue))

这里声明的类型约束是这个集合的概念:

Key1 
|--Value1 
|--Value2 
Key2 (No Values) 
Key3 
|--Value3 
|--Value4 
|--Value5 
Key4 
... 

凭借经典的泛型集合的共同成员,像自定义成员:

GetValue(Key, Index) As TValue 
RemoveValueAt(Key, Index) As TValue 
ClearCollection(Key) 
... 

乍一看,最好的选择是创建一个派生类:

Public Class SortedCollection(Of TKey As IComparable, TValue) 
    Inherits SortedList(Of TKey, List(Of TValue)) 
    ... 

但是,没有:你不能覆盖Add()方法,我想在这个SortedCollection类调用方式如下:

Dim MyCol As New SortedCollection(Of String, String)() 
MyCol.Add("Car", "Ford") 
MyCol.Add("Aircraft", "Boeing") 
MyCol.Add("Aircraft", "Airbus") 
MyCol.Add("Boat", "Aircraft Carrier") 
MyCol.Add("Boat", "Aircraft Carrier") '// Doesn't throw Exception ! 
MyCol.Add("Car", "") '// Doesn't throw Exception ! 

'// "Aircraft" -> "Boeing", "Airbus" 
'// "Car" -> "Ford", "" 
'// "Boat" -> "Aircraft Carrier", "Aircraft Carrier" 

有人可能会认为使用暗影(VB)的关键字(如果有帮助),但我想避免它(因为团队中的其他人可能在代码上工作,我们不喜欢对此或那个用法不同意)

然后,我猜最好的选择是用适当的接口(IEnumerable,ICollection(Of KeyValuePair)等)创建一个自定义集合类,这是我在来这里之前所尝试的。

那么从哪里开始呢?

这个问题的重点不在于讨论应该使用的接口,也不是讨论这种集合的使用类型,而是要开始正确的方式。 我找到的所有的文件都是关于物品的集合,但我没有发现任何关于集合的集合。作为不同类型的集合(box/unbox,base/derived,interfaces/implementation),或者实际上并不是集合集合,而是集合KeyValuePair(TGroup, TValue),但没有一个集合用两种泛型类型给出了清晰的图像,第二种是基础集合的类型。

特别是实现IEnumerable接口时:要开始用正确的枚举类,它必须被声明为:

'// iterates all Values through the Keys 
SortedCollectionEnumerator(Of TKey, TValue) As IEnumerator ??? 
SortedCollectionEnumerator(Of TKey, TValue) As IEnumerator(Of TKey) ??? 
SortedCollectionEnumerator(Of TKey, TValue) As IEnumerator(Of TValue) ??? 
SortedCollectionEnumerator(Of TKey, TValue) As IEnumerator(Of TKey, TValue) ??? 

最后一个不存在。否则做什么。所有到目前为止,我采用的是Enumerator(Of T)


或者我应该从头开始创建一切(这是我此刻在做什么),包括枚举(推倒重来?避免它,因为他们说...)会这样吗?或者从CollectionBase派生并实现大量约束和检查?

我不需要线程安全;它不适用于数据库或网络。 DotNet 4.0,4.5,4.6或以上,无论如何! VBNet(根据项目的要求),但C#是受欢迎的(个人喜好)

只是准则,如果你愿意帮助,也许是一些重要的观点,如Dispose(),不推荐使用的方法/属性,以避免...

谢谢。

回答

1

而不是从SortedList派生出来,包装SortedList<TKey, List<TValue>>(即将其作为专用字段)。然后实现您需要的任何接口并在内部使用私有成员。

+0

是的,我们已经开始了。然后,通过所有必需的接口,我们最终意识到我们创建了一个巨大的类,它首先在没有任何接口的情况下工作得更好**,然后我们问自己是否真的没有重新发明轮子。在某种程度上,我很高兴我们有同样的想法,如果唯一的答案是为所有成员重写代码,那么,我想它就是这样。:-) –

+0

通过包装一个'SortedList',你只是应用适配器模式。如果你自己没有开始实施排序算法等,你没有重新发明轮子,恕我直言。 – Dejan