2009-03-24 7 views
7

一般的なリストのサイズを制限して、一定量の値が入ってからそれ以上は追加しないようにしようとしています。List(Of T)のサイズを制限する - VB.NET

ListオブジェクトのCapacityプロパティを使用してこれを実行しようとしていますが、これは機能していないようです。

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

リストのサイズを制限する人のアドバイスはどのようになりますか?

各オブジェクトが追加された後、リストのサイズを確認しないようにしようとしています。

答えて

9

List<T>に物事を追加するには、いくつかの異なる方法があります、などAddRange、挿入し、追加

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です。

14

List(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 
0

項目の最大数を制限する必要がある場合は、独自のリスト/コレクションを実装する必要があります。

0

リストにそのような機能はありません。

capacity stuffはパフォーマンスの最適化に過ぎません。

独自のクラスをロールしてリストを派生させ、Add実装をオーバーライドする必要があります。

5

新しいLimitedListを派生させ、追加方法をシャドーしたいと思うでしょう。このような何かがあなたを始めるでしょう。ちょうどあなたがVBにいる実現

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のバージョンのために翻訳します。誰かがC#のバージョンを使い始めることを望む場合に備えて、ここに残しておきます。

私の価値があるのは、それをカプセル化するのではなく、Listクラスを拡張するので、やや異なるアプローチが必要です。どのアプローチを使用するかは、状況によって異なります。

+1

あなたの解決策は問題を引き起こします。なぜなら、人々が新しいAddメソッドをバイパスして古いメソッドを使用する可能性があるからです。 – JaredPar

+0

はい、私の簡単な例は完全ではありません。簡単な例のように、基になるリストにアクセスすることはできません。私はちょうど別のアプローチを示していました。 –

関連する問題