2009-03-24 11 views
7

Próbuję ograniczyć rozmiar mojej ogólnej listy, aby po dodaniu określonej wartości nie dodawał więcej.Ogranicz rozmiar listy (z T) - VB.NET

Próbuję to zrobić za pomocą właściwości Capacity obiektu List, ale to nie działa.

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

Jak ludzie radzą ograniczać rozmiar listy?

Próbuję uniknąć sprawdzania rozmiaru listy po dodaniu każdego obiektu.

Odpowiedz

9

Istnieje kilka różnych sposobów dodawania rzeczy do List<T> Dodawanie, AddRange, Insert, itp

rozważyć rozwiązanie, które dziedziczy 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 

ten sposób pojemność jest przestrzegana, czy ty Add lub Insert.

14

Nie ma wbudowanego sposobu ograniczenia rozmiaru listy (z T). Właściwość Capacity jedynie modyfikuje rozmiar bufora underyling, nie ograniczając go.

Jeśli chcesz ograniczyć rozmiar listy, musisz utworzyć opakowanie, które sprawdza, czy jest on nieprawidłowy. Na przykład:

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 
0

Powinieneś zaimplementować własną listę/kolekcję, jeśli chcesz ograniczyć maksymalną ilość pozycji w nim.

0

Lista nie ma takiego obiektu.

capacity stuff to tylko optymalizacja wydajności.

Będziesz musiał rzucić własną klasą, wypisać z listy i zastąpić dodawanie implementacji.

5

Będziesz chciał wyposażyć nowy LimitedList i zasłonić metody dodawania. Coś w tym stylu pozwoli ci zacząć.

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); 
    } 
} 

sobie sprawę, że jesteś w VB, będę tłumaczyć wkrótce

Edit See Jared dla wersji VB. Zostawię to tutaj na wypadek, gdyby ktoś chciał wersji C#, aby zacząć.

Bo to, co jest moje, przyjmuje nieco inne podejście, ponieważ rozszerza klasę List, a nie ją enkapsuluje. To, które podejście chcesz zastosować, zależy od twojej sytuacji.

+1

Twoje rozwiązanie może spowodować problemy, ponieważ ludzie mogą ominąć nową metodę dodawania i używać starej. – JaredPar

+0

Tak, mój krótki przykład nie jest kompletny. Podobnie jak w przypadku twojego krótkiego przykładu, nie możesz uzyskać dostępu do podstawowej listy. Po prostu pokazywałem inne podejście. –