限制 List(Of T) 的大小 - VB.NET

7
我试图限制泛型列表的大小,以便在它包含一定数量的值之后,它不再添加任何值。
我尝试使用List对象的Capacity属性来实现这一点,但似乎并没有起作用。
        Dim slotDates As New List(Of Date)
        slotDates.Capacity = 7

如何建议限制列表的大小?

我试图避免在每个对象添加后检查列表的大小。

5个回答

15

没有内置的方法来限制 List(Of T) 的大小。容量属性只是修改底层缓冲区的大小,而不是限制它。

如果您想限制 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

11

有几种不同的方式可以将内容添加到 List<T> 中:Add、AddRange、Insert 等。

考虑继承自 Collection<T> 的解决方案:

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,容量都会得到尊重。


5

您需要派生一个新的LimitedList并屏蔽添加方法。以下代码可以帮助您入门。

public class LimitedList<T> : List<T>
{
    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类而不是封装它。您想使用哪种方法取决于您的情况。


1
虽然您的解决方案可以解决问题,但是仍有可能会有人绕过新的 Add 方法而使用旧方法。 - JaredPar
是的,我的简短示例并不完整。就像你的简短示例不能让你访问底层列表一样。我只是展示了一种不同的方法。 - Garry Shutler

0
如果您需要限制列表/集合中的最大项目数量,那么您应该实现自己的列表/集合。

0

列表没有这样的功能。

容量相关的东西只是性能优化。

你需要自己编写一个类,继承自列表并覆盖Add实现。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接