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()で縮小できる
-
AptWatcherの発表:サーバーのaptパッケージ更新をSlackへ通知するシンプルなツール
Honeybadgerでは、すべてのサーバーにおけるaptパッケージの更新状況を把握し続けるために、これまで「apticron」を活用してきました。当初はapticronからの通知メールを自分の受信箱で確認していましたが、途中から「Slackの通知チャンネルに流れたほうが扱いやすい」と感じるようになりました。Slackにはメールを受信してそのままチャンネルへ投稿できるEmailアプリがあり、まずはそれを試してみました。ところが実際に使ってみると、メールがファイルとして表示されてしまったり、メールヘッダーのノイズが目立ったりと、どうにもしっくりきません。そこで「もう少しこなれた仕組みを自分で作ろ
-
Discord コマンド一覧|覚えておきたいチャット&ボットコマンド徹底解説
オンラインゲームをプレイするゲーマーの間では、Mumble、Steam、TeamSpeakなど、さまざまなチャットアプリを使ってゲーム中にコミュニケーションを取るのが一般的です。最近特に人気が高く、多くのユーザーに利用されているのが「Discord」です。Discordを使えば、プライベートサーバーを通じて他のプレイヤーと音声通話やビデオ通話、テキストチャットが可能になります。Discordには複数のコマンドが用意されており、サーバー内で入力することで作業効率の向上、チャンネルの管理、そしてコミュニケーションをより楽しくすることができます。これらのコマンドは「Discord ボットコマンド」と