7 votes

Limiter la taille d'une liste (de T) - VB.NET

J'essaie de limiter la taille de ma liste générique de manière à ce que, lorsqu'elle contient un certain nombre de valeurs, elle n'en ajoute pas d'autres.

J'essaie d'utiliser la propriété Capacity de l'objet List, mais cela ne semble pas fonctionner.

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

Que conseille-t-on pour 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.

15voto

JaredPar Points 333733

Il n'existe pas de moyen intégré de limiter la taille d'une liste (de T). La propriété Capacity modifie simplement la taille de la mémoire tampon sous-jacente, elle ne la limite pas.

Si vous souhaitez limiter la taille de la liste, vous devez créer une enveloppe qui vérifie que la taille n'est pas invalide. 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

11voto

Kyralessa Points 76456

Il existe plusieurs façons d'ajouter des éléments à un List<T> : Ajouter, Ajouter une plage, Insérer, etc.

Considérons 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 manière, la capacité est respectée, que vous Add o Insert .

5voto

Garry Shutler Points 20898

Vous devez créer un nouveau LimitedList et d'ombrer les méthodes d'addition. Vous pourrez ainsi vous lancer dans l'aventure.

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

Je viens de me rendre compte que vous êtes en VB, je traduirai bientôt.

Editar Voir Jared's pour une version VB. Je le laisse ici au cas où quelqu'un voudrait une version C# pour commencer.

Pour ce qu'elle vaut, la mienne adopte une approche légèrement différente puisqu'elle étend la classe List au lieu de l'encapsuler. L'approche que vous souhaitez utiliser dépend de votre situation.

0voto

Fabian Vilers Points 1679

Vous devez mettre en place votre propre liste/collection si vous avez besoin de restreindre la quantité maximale d'éléments qu'elle contient.

0voto

Sam Saffron Points 56236

La liste ne dispose pas d'un tel dispositif.

Les capacité d'accueil n'est qu'une optimisation des performances.

Vous allez devoir créer votre propre classe, dériver de la liste et surcharger l'implémentation de Add.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X