2009-03-24 4 views
7

J'essaie de limiter la taille de ma liste générique afin qu'après qu'elle contienne une certaine quantité de valeurs, elle n'ajoutera plus.Limiter la taille de List (Of T) - VB.NET

J'essaie de le faire en utilisant la propriété Capacity de l'objet List, mais cela ne semble pas fonctionner.

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

Comment les gens pourraient-ils conseiller de limiter la taille d'une liste? J'essaie d'éviter de vérifier la taille de la liste après l'ajout de chaque objet.

Répondre

9

Il y a plusieurs façons d'ajouter des choses à un List<T>: Ajouter, AddRange, Insérer, etc.

envisager une solution qui hérite de 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 

De cette façon, la capacité est respectée si vous Add ou Insert.

14

Il n'existe aucun moyen intégré pour limiter la taille d'une liste (Of T). La propriété Capacity modifie simplement la taille du buffer underyling, sans le restreindre.

Si vous souhaitez limiter la taille de la liste, vous devez créer un encapsuleur qui vérifie les tailles invalides. Par exemple

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

Vous devez implémenter votre propre liste/collection si vous devez limiter la quantité maximale d'élément.

0

La liste ne possède pas cette fonctionnalité. Le capacity stuff est juste une optimisation des performances.

Vous allez devoir lancer votre propre classe, dériver la liste et remplacer l'implémentation Ajouter.

5

Vous aurez besoin de dériver un nouveau LimitedList et d'ombrer les méthodes d'ajout. Quelque chose comme ça vous aidera à démarrer.

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

viens juste de réaliser que vous êtes en VB, je traduis peu

Modifier Voir Jared pour une version VB. Je vais laisser ceci ici au cas où quelqu'un voudrait une version C# pour commencer. Pour ce que ça vaut le mien prend une approche légèrement différente car il étend la classe List plutôt que de l'encapsuler. L'approche que vous souhaitez utiliser dépend de votre situation.

+1

Votre solution causera cependant des problèmes car il est toujours possible que les gens contournent la nouvelle méthode Add et utilisent l'ancienne. – JaredPar

+0

Oui, mon bref exemple n'est pas complet. Tout comme votre bref exemple ne vous permet pas d'accéder à la liste sous-jacente. Je montrais juste une approche différente. –