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

C#のListの容量(Capacity)を取得する方法【サンプルコード付き】

C#のList<T>には、内部的に確保されている配列のサイズを表すCapacityプロパティが用意されています。この記事では、リストの容量を取得する方法と、要素数(Count)との違いについて、サンプルコードと実行結果をもとにわかりやすく解説します。

リストの容量(Capacity)とは?

Capacityは、リストが内部的に確保しているメモリ領域の大きさを示します。一方、Countは実際に格納されている要素の数です。要素を追加していきCountがCapacityに達すると、リストは自動的に容量を拡張します(通常は現在の容量の2倍)。そのため、Capacityは必ずしもCountと一致するとは限りません。

例1:Capacityプロパティで容量を取得する

まず、基本的な使い方から見ていきましょう。リストの容量を取得するコードは次のとおりです。

using System;
using System.Collections.Generic;

public class Demo {
   public static void Main(String[] args) {
      List<string> list1 = new List<string>();
      list1.Add("One");
      list1.Add("Two");
      list1.Add("Three");
      list1.Add("Four");
      list1.Add("Five");

      Console.WriteLine("List1の要素一覧...");
      foreach (string res in list1) {
         Console.WriteLine(res);
      }
      Console.WriteLine("List1のCapacity = " + list1.Capacity);

      List<string> list2 = new List<string>();
      list2.Add("India");
      list2.Add("US");
      list2.Add("UK");
      list2.Add("Canada");
      list2.Add("Poland");
      list2.Add("Netherlands");

      Console.WriteLine("List2の要素一覧...");
      foreach (string res in list2) {
         Console.WriteLine(res);
      }
      Console.WriteLine("List2のCapacity = " + list2.Capacity);
      Console.WriteLine("List2はList1と等しいか? = " + list2.Equals(list1));
   }
}

実行結果

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

List1の要素一覧...
One
Two
Three
Four
Five
List1のCapacity = 8
List2の要素一覧...
India
US
UK
Canada
Poland
Netherlands
List2のCapacity = 8
List2はList1と等しいか? = False

5つの要素しか追加していないのにCapacityが「8」になっている点に注目してください。これは、空のリストに最初の要素を追加した時点で容量が4に設定され、5つ目の要素を追加した際に自動的に8へ拡張されたためです。6つの要素を持つlist2も同じく容量8となっています。また、Equals()の結果がFalseになっているのは、両リストの内容が異なるためです。

例2:Clear()を実行してもCapacityは維持される

続いて、Clear()メソッドを使った場合のCountとCapacityの変化を確認してみましょう。

using System;
using System.Collections.Generic;

public class Demo {
   public static void Main(String[] args) {
      List<string> list = new List<string>();
      list.Add("One");
      list.Add("Two");
      list.Add("Three");
      list.Add("Four");
      list.Add("Five");

      Console.WriteLine("\nListの要素数 = " + list.Count);
      Console.WriteLine("ListのCapacity(更新後) = " + list.Capacity);

      list.Clear();

      Console.WriteLine("\nListの要素数(Clear後) = " + list.Count);
      Console.WriteLine("ListのCapacity(Clear後) = " + list.Capacity);
   }
}

実行結果

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

Listの要素一覧...
One
Two
Three
Four
Five
Listの要素数 = 5
ListのCapacity(更新後) = 8
Listの要素数(Clear後) = 0
ListのCapacity(Clear後) = 8

Clear()を呼び出すと要素数(Count)は0になりますが、Capacityは8のまま変わりません。つまり、Clear()は要素を削除するだけで、確保されたメモリ領域は解放されないのです。

容量を縮小したい場合はTrimExcess()を使う

不要になったメモリを解放したい場合は、TrimExcess()メソッドを呼び出します。これにより、実際の要素数に合わせてCapacityが縮小されます。また、あらかじめ要素数がわかっている場合は、コンストラクタで初期容量を指定する(例:new List<string>(100))ことで、不要な再割り当てを防ぎ、パフォーマンスを向上させることができます。

まとめ

  • Count:リストに実際に格納されている要素の数
  • Capacity:内部的に確保されている配列のサイズ
  • 容量が不足すると、通常は2倍ずつ自動的に拡張される
  • Clear()してもCapacityは維持され、TrimExcess()で縮小できる
  1. AptWatcherの発表:サーバーのaptパッケージ更新をSlackへ通知するシンプルなツール

    Honeybadgerでは、すべてのサーバーにおけるaptパッケージの更新状況を把握し続けるために、これまで「apticron」を活用してきました。当初はapticronからの通知メールを自分の受信箱で確認していましたが、途中から「Slackの通知チャンネルに流れたほうが扱いやすい」と感じるようになりました。Slackにはメールを受信してそのままチャンネルへ投稿できるEmailアプリがあり、まずはそれを試してみました。ところが実際に使ってみると、メールがファイルとして表示されてしまったり、メールヘッダーのノイズが目立ったりと、どうにもしっくりきません。そこで「もう少しこなれた仕組みを自分で作ろ

  2. Discord コマンド一覧|覚えておきたいチャット&ボットコマンド徹底解説

    オンラインゲームをプレイするゲーマーの間では、Mumble、Steam、TeamSpeakなど、さまざまなチャットアプリを使ってゲーム中にコミュニケーションを取るのが一般的です。最近特に人気が高く、多くのユーザーに利用されているのが「Discord」です。Discordを使えば、プライベートサーバーを通じて他のプレイヤーと音声通話やビデオ通話、テキストチャットが可能になります。Discordには複数のコマンドが用意されており、サーバー内で入力することで作業効率の向上、チャンネルの管理、そしてコミュニケーションをより楽しくすることができます。これらのコマンドは「Discord ボットコマンド」と