Ограничить размер списка (Of T) - VB.NET - PullRequest
7 голосов
/ 24 марта 2009

Я пытаюсь ограничить размер моего общего списка, чтобы после того, как он содержит определенное количество значений, он больше не добавлялся.

Я пытаюсь сделать это, используя свойство Capacity объекта List, но, похоже, это не работает.

        Dim slotDates As New List(Of Date)
        slotDates.Capacity = 7

Как люди посоветовали бы ограничить размер списка?

Я стараюсь не проверять размер списка после добавления каждого объекта.

Ответы [ 5 ]

14 голосов
/ 24 марта 2009

Не существует встроенного способа ограничения размера списка (Of T). Свойство Capacity просто изменяет размер буфера нижнего уровня, а не ограничивает его.

Если вы хотите ограничить размер списка, вам нужно создать оболочку, которая проверяет наличие неверных размеров. Например

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
10 голосов
/ 24 марта 2009

Существует несколько различных способов добавления объектов в List<T>: Добавить, Добавить диапазон, Вставить и т. Д.

Рассмотрим решение, которое наследуется от 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 голосов
/ 24 марта 2009

Вы хотите получить новый 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, я скоро переведу

Редактировать См. Джареда для версии VB. Я оставлю это здесь на случай, если кто-то захочет начать работу с версией C #.

Для того, чтобы это стоило моего, требуется немного другой подход, так как он расширяет класс List вместо его инкапсуляции. Какой подход вы хотите использовать, зависит от вашей ситуации.

0 голосов
/ 24 марта 2009

Список не имеет такого объекта.

Емкость - это просто оптимизация производительности.

Вам нужно будет свернуть свой собственный класс, вывести список из списка и переопределить реализацию Add.

0 голосов
/ 24 марта 2009

Вы должны реализовать свой собственный список / коллекцию, если вам нужно ограничить максимальное количество элементов в нем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...