2009-03-24 4 views
7

Ich versuche, die Größe meiner generischen Liste zu begrenzen, so dass nach dem es eine bestimmte Anzahl von Werten enthält, wird es nicht mehr hinzufügen.Begrenzen Sie die Größe der Liste (Of T) - VB.NET

Ich versuche, dies mit der Capacity-Eigenschaft des List-Objekts zu tun, aber das scheint nicht zu funktionieren.

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

Wie würden Menschen beraten, die Größe einer Liste zu begrenzen?

Ich versuche zu vermeiden, die Größe der Liste nach dem Hinzufügen jedes Objekts zu überprüfen.

Antwort

9

Es gibt verschiedene Möglichkeiten, Dinge zu einem List<T> hinzuzufügen: Hinzufügen, AddRange, Einfügen, usw.

eine Lösung in Betracht, das von Collection<T> erbt:

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 

diese Weise der Kapazität geachtet wird, ob Sie Add oder Insert.

14

Es gibt keine integrierte Möglichkeit, die Größe einer Liste (Of T) zu begrenzen. Die Capacity-Eigenschaft ändert lediglich die Größe des Undering-Puffers und beschränkt sie nicht.

Wenn Sie die Größe der Liste begrenzen möchten, müssen Sie einen Wrapper erstellen, der nach ungültigen Größen sucht. Zum Beispiel

0

Sie sollten Ihre eigene Liste/Sammlung implementieren, wenn Sie die maximale Menge an Artikel darin beschränken müssen.

0

Liste hat keine solche Einrichtung.

Die capacity stuff ist nur eine Leistungsoptimierung.

Sie müssen Ihre eigene Klasse rollen, abgeleitete Liste ableiten und die Implementierung hinzufügen überschreiben.

5

Sie möchten eine neue LimitedList ableiten und die Addiermethoden überschreiben. So etwas wird dich beginnen.

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

einfach realisiert man in VB sind, werde ich kurz

bearbeiten Siehe Jareds für eine VB-Version übersetzen. Ich werde das hier lassen, falls jemand eine C# Version haben möchte.

Für was es wert ist meins nimmt einen etwas anderen Ansatz, wie es die List-Klasse erweitert, anstatt es zu kapseln. Welcher Ansatz Sie verwenden möchten, hängt von Ihrer Situation ab.

+1

Ihre Lösung wird jedoch Probleme verursachen, da es immer noch möglich ist, dass Personen die neue Add-Methode umgehen und die alte Methode verwenden. – JaredPar

+0

Ja, mein kurzes Beispiel ist nicht vollständig. Genauso wie Ihr kurzes Beispiel es Ihnen nicht erlaubt, auf die zugrunde liegende Liste zuzugreifen. Ich zeigte nur einen anderen Ansatz. –

Verwandte Themen