C#
 Computer >> コンピューター >  >> プログラミング >> C#

【C#】SortedListの容量(Capacity)を取得する方法とその挙動を解説

C#のSortedListクラスでは、Capacityプロパティを参照することで、現在確保されているコレクションの容量(格納できる要素の総数)を取得できます。本記事では、具体的なコード例と実行結果をもとに、Capacityプロパティの基本的な使い方と挙動をわかりやすく解説します。

Capacityプロパティとは

Capacityプロパティは、SortedListが内部で確保している配列のサイズ、つまり「再割り当てなしで格納できる要素の総数」を返します。よく似たプロパティにCountがありますが、こちらは「実際に格納されているキーと値のペアの数」を返すという違いがあります。要素を追加してCountがCapacityを超えると、容量は自動的に拡張されます。

例1:SortedListの容量を取得する

次の例では、10個のキーと値のペアをSortedListに追加し、CountとCapacityの両方をコンソールに表示しています。あわせて、列挙子(IDictionaryEnumerator)を使った要素の反復処理も行っています。

using System;
using System.Collections;
public class Demo {
   public static void Main(String[] args){
      SortedList sortedList = new SortedList();
      sortedList.Add("A", "1");
      sortedList.Add("B", "2");
      sortedList.Add("C", "3");
      sortedList.Add("D", "4");
      sortedList.Add("E", "5");
      sortedList.Add("F", "6");
      sortedList.Add("G", "7");
      sortedList.Add("H", "8");
      sortedList.Add("I", "9");
      sortedList.Add("J", "10");
      Console.WriteLine("SortedListの要素...");
      foreach(DictionaryEntry d in sortedList){
         Console.WriteLine("Key = "+d.Key + ", Value = " + d.Value);
      }
      Console.WriteLine("SortedListのキーと値のペアの数 = "+sortedList.Count);
      Console.WriteLine("SortedListの容量 = "+sortedList.Capacity);
      Console.WriteLine("\n列挙子を使ってSortedListを反復処理...");
      IDictionaryEnumerator demoEnum = sortedList.GetEnumerator();
      while (demoEnum.MoveNext())
         Console.WriteLine("Key = " + demoEnum.Key + ", Value = " + demoEnum.Value);
   }
}

実行結果

上記のコードを実行すると、次のような出力が得られます。

SortedListの要素...
Key = A, Value = 1
Key = B, Value = 2
Key = C, Value = 3
Key = D, Value = 4
Key = E, Value = 5
Key = F, Value = 6
Key = G, Value = 7
Key = H, Value = 8
Key = I, Value = 9
Key = J, Value = 10
SortedListのキーと値のペアの数 = 10
SortedListの容量 = 16

列挙子を使ってSortedListを反復処理...
Key = A, Value = 1
Key = B, Value = 2
Key = C, Value = 3
Key = D, Value = 4
Key = E, Value = 5
Key = F, Value = 6
Key = G, Value = 7
Key = H, Value = 8
Key = I, Value = 9
Key = J, Value = 10

実行結果のポイント

10個の要素を追加しましたが、Capacityは16のままです。これは、引数なしのコンストラクタでSortedListを生成した場合、初期容量が16に設定されるためです。要素数が16を超えた時点で、容量は自動的に32へと倍増します。

また、GetEnumerator()メソッドで取得したIDictionaryEnumeratorを使えば、foreach文と同様にキーと値を順番に取り出すことができます。SortedListはキーに基づいて自動的にソートされるため、追加した順序に関係なく、キーの昇順で要素が表示される点にも注目してください。

例2:Clearメソッド実行後の容量の変化

続いて、Clear()メソッドですべての要素を削除した場合に、CountとCapacityがどのように変化するかを確認してみましょう。

using System;
using System.Collections;
public class Demo {
   public static void Main(String[] args){
      SortedList sortedList = new SortedList();
      sortedList.Add("A", "1");
      sortedList.Add("B", "2");
      sortedList.Add("C", "3");
      sortedList.Add("D", "4");
      sortedList.Add("E", "5");
      sortedList.Add("F", "6");
      Console.WriteLine("SortedListの要素...");
      foreach(DictionaryEntry d in sortedList){
         Console.WriteLine("Key = "+d.Key + ", Value = " + d.Value);
      }
      Console.WriteLine("Clear前:SortedListのキーと値のペアの数 = "+sortedList.Count);
      Console.WriteLine("Clear前:SortedListの容量 = "+sortedList.Capacity);
      sortedList.Clear();
      Console.WriteLine("Clear後:SortedListのキーと値のペアの数 = "+sortedList.Count);
      Console.WriteLine("Clear後:SortedListの容量 = "+sortedList.Capacity);
   }
}

実行結果

SortedListの要素...
Key = A, Value = 1
Key = B, Value = 2
Key = C, Value = 3
Key = D, Value = 4
Key = E, Value = 5
Key = F, Value = 6
Clear前:SortedListのキーと値のペアの数 = 6
Clear前:SortedListの容量 = 16
Clear後:SortedListのキーと値のペアの数 = 0
Clear後:SortedListの容量 = 16

実行結果のポイント

Clear()メソッドを実行すると、すべての要素が削除されCountは0になります。しかし、Capacityは16のまま変わりません。つまり、Clearメソッドは要素を削除するだけで、内部配列として確保された容量自体は解放されないのです。

補足:容量を縮小するにはTrimToSizeを使う

不要になった容量を明示的に縮小したい場合は、TrimToSize()メソッドを使用します。このメソッドを呼び出すと、容量が実際の要素数(Count)まで切り詰められます。空のSortedListに対して呼び出した場合は、容量が既定の初期容量である16に戻ります。

sortedList.Clear();
sortedList.TrimToSize();
Console.WriteLine("SortedListの容量 = " + sortedList.Capacity); // 出力: 16

このように、CountとCapacityの違い、そしてClearやTrimToSizeの挙動を正しく理解しておくことで、SortedListをより効率的に扱えるようになります。

  1. C#のSortedListクラスのCapacityプロパティとは?意味と使い方を解説

    C#のSortedListクラスにおけるCapacityプロパティとはSortedListクラスのCapacity(容量)プロパティは、SortedListが保持できる要素数の最大サイズを示すプロパティです。つまり、内部的に確保されている配列が格納できる要素の総数を表しています。なお、SortedListの既定の容量(デフォルト値)は16に設定されています。要素を追加していき容量を超えると、容量は自動的に拡張される仕組みになっています。以下のコードを実行すると、C#でSortedListクラスのCapacityプロパティを実際に確認できます。コード例using System; using Sy

  2. Pythonでカープーリング問題を解く方法

    ある車両があり、最初に乗客用の空席が capacity 分だけ用意されているとします。この車両は東方向にしか走行できないため、折り返して西へ戻ることはできません。ここで、trip[i] = [num_passengers, start_location, end_location] という形式の乗車情報リスト trips が与えられます。num_passengers は乗車させる人数、start_location と end_location はそれぞれ乗客を乗せる地点と降ろす地点です。なお、各地点は車両の初期位置から東方向への距離(キロメートル)として表されます。 このモジュールは、与えら