我试图限制我的通用列表的大小,以便在它包含一定数量的值后,它将不再添加.
我试图使用List对象的Capacity属性执行此操作,但这似乎不起作用.
Dim slotDates As New List(Of Date) slotDates.Capacity = 7
人们如何建议限制列表的大小?
我试图避免在添加每个对象后检查List的大小.
没有内置方法来限制List(Of T)的大小.Capacity属性仅修改底层缓冲区的大小,而不是限制它.
如果要限制List的大小,则需要创建一个检查无效大小的包装器.例如
Public Class RestrictedList(Of T) Private _list as New List(Of T) Private _limit as Integer Public Property Limit As Integer Get return _limit End Get Set _limit = Value End Set End Property Public Sub Add(T value) if _list.Count = _limit Then Throw New InvalidOperationException("List at limit") End If _list.Add(value) End Sub End Class
有几种不同的方法可以添加东西List
:Add,AddRange,Insert等.
考虑一个继承自Collection
以下的解决方案:
Public Class LimitedCollection(Of T) Inherits System.Collections.ObjectModel.Collection(Of T) Private _Capacity As Integer Public Property Capacity() As Integer Get Return _Capacity End Get Set(ByVal value As Integer) _Capacity = value End Set End Property Protected Overrides Sub InsertItem(ByVal index As Integer, ByVal item As T) If Me.Count = Capacity Then Dim message As String = String.Format("List cannot hold more than {0} items", Capacity) Throw New InvalidOperationException(message) End If MyBase.InsertItem(index, item) End Sub End Class
通过这种方式,能得到尊重你是否Add
还是Insert
.
你想要得到一个新的LimitedList
和阴影的添加方法.这样的事情会让你开始.
public class LimitedList: List { private int limit; public LimitedList(int limit) { this.limit = limit; } public new void Add(T item) { if (Count < limit) base.Add(item); } }
刚刚意识到你在VB,我很快就会翻译
编辑请参阅Jared的VB版本.我会留下这个,以防有人想要一个C#版本开始.
对于它的价值,我采用了稍微不同的方法,因为它扩展了List类而不是封装它.您想要使用哪种方法取决于您的情况.