C#でデータを扱う上で、配列よりも柔軟に要素を追加・削除できる List<T> クラスは非常に便利です。
しかし、いざリストを使おうとすると、
「最初から値を入れておくには?」
「要素数だけ確保したい時は?」
・・・といった初期化に関する疑問が次々と出てくるものです。
特に、C#はバージョンアップに伴って新しい書き方が次々と追加されているため、古い情報と新しい情報が混在して混乱してしまうことも少なくありません。
この記事では、最も基本的な new を使った初期化から、C# 12で導入された最新の「コレクション式」、そして同じ値で埋める一括初期化テクニックまで、現在の開発現場で推奨される List の初期化方法をサンプルコード付きで徹底解説します。
![]() 執筆者:マヒロ |
|
- OS:Windows 11 / macOS Sequoia
- IDE:Visual Studio / VS Code / IntelliJ IDEA
- その他:Chrome DevTools / 各言語最新安定版
※本メディアでは、上記環境にてコードの動作と情報の正確性を検証済みです。
【基本】空のリストを作成する
まずは、要素を何も持っていない「空のリスト」を作成する基本的な方法です。
後から Add メソッドでデータを追加していく場合は、この書き方が基本となります。
new演算子を使った初期化
using System;
using System.Collections.Generic;
class Program
{
static void Main()
{
// 空のリストを作成
List<int> numbers = new List<int>();
Console.WriteLine($"要素数: {numbers.Count}");
// C# 9.0以降なら new() だけでもOK(ターゲット型推論)
List<string> names = new();
Console.WriteLine($"名前リストの要素数: {names.Count}");
}
}
実行結果
要素数: 0
名前リストの要素数: 0
new List<int>() と記述することで、整数(int)を格納するための空のリストインスタンスが生成されます。
C# 9.0以降を使用している場合は、左辺で型が明示されているため、右辺は new() と短縮して書くことが可能です。
現場でもこの省略記法は頻繁に使われるので覚えておきましょう。
【推奨】値を指定してリストを初期化する
最初から特定の値が入った状態でリストを作りたい場合、いくつかの書き方があります。
特に、最新のC#を使える環境であれば「コレクション式」が最もスマートです。
1. コレクション式を使う(C# 12以降)
現在、最も推奨されるモダンな書き方です。
角括弧 [] を使うだけでリストを初期化できます。
using System;
using System.Collections.Generic;
class Program
{
static void Main()
{
// コレクション式による初期化
List<int> scores = [10, 20, 30];
Console.WriteLine($"scores: {string.Join(", ", scores)}");
}
}
実行結果
scores: 10, 20, 30
非常にシンプルで可読性が高いのが特徴です。
内部的には最適な方法でコレクションが生成されるため、パフォーマンスの面でも優れています。
特別な理由がない限り、この書き方を使うと良いでしょう。
2. コレクション初期化子を使う(従来の方法)
C# 12未満の環境では、波括弧 {} を使った「コレクション初期化子」を使用します。
List<string> fruits = new List<string> { "Apple", "Banana", "Orange" };
new List<型> { 値1, 値2, ... } という形式で記述します。
長く使われてきた記法なので、既存のプロジェクトや参考書ではこの書き方をよく見かけるはずです。
要素数(Capacity)を指定して初期化する際の注意点
「最初に100個分の領域を確保しておきたい」という場合、コンストラクタに数値を渡すことができますが、これには少し誤解しやすいポイントがあります。
Capacity(容量)とCount(要素数)の違い
using System;
using System.Collections.Generic;
class Program
{
static void Main()
{
// 容量(Capacity)を5に指定して初期化
List<int> numbers = new List<int>(5);
Console.WriteLine($"Count(要素数): {numbers.Count}");
Console.WriteLine($"Capacity(容量): {numbers.Capacity}");
// numbers[0] = 1; // これはエラーになります!
}
}
実行結果
Count(要素数): 0
Capacity(容量): 5
new List<int>(5) と書くと、内部的に「5個分のデータを入れられるメモリ領域」は確保されますが、実際のデータ(要素)はまだ0個の状態です。
そのため、この状態で numbers[0] = 1; のようにインデックスを指定してアクセスしようとすると、「範囲外エラー(ArgumentOutOfRangeException)」が発生します。
あくまで「これからたくさん追加するから、メモリを確保しておいてパフォーマンスを上げたい」という時に使う機能だと理解してください。
指定した「要素数」で初期化し、同じ値で埋める方法
「最初から0が10個入ったリストが欲しい」というように、実際の要素数(Count)を持つリストを作りたい場合は、LINQの Enumerable.Repeat を使うのが便利です。
Enumerable.Repeatを使う
using System;
using System.Collections.Generic;
using System.Linq; // LINQを使うために必要
class Program
{
static void Main()
{
// 0 を 5個 持つリストを作成
List<int> zeros = Enumerable.Repeat(0, 5).ToList();
// "Unknown" を 3個 持つリストを作成
List<string> unknowns = Enumerable.Repeat("Unknown", 3).ToList();
Console.WriteLine($"zeros: {string.Join(", ", zeros)}");
Console.WriteLine($"unknowns: {string.Join(", ", unknowns)}");
}
}
実行結果
zeros: 0, 0, 0, 0, 0
unknowns: Unknown, Unknown, Unknown
Enumerable.Repeat(値, 個数) で指定した値が繰り返されるシーケンスを作成し、最後に .ToList() メソッドを呼ぶことでリスト型に変換しています。
この方法なら、作成直後から zeros[3] = 99; のようにインデックスアクセスが可能です。
他の配列やリストから初期化する(コピー)
すでに存在する配列やリストの中身を使って、新しいリストを初期化したい場合も簡単に行えます。
コンストラクタにコレクションを渡す
using System;
using System.Collections.Generic;
class Program
{
static void Main()
{
int[] originalArray = { 1, 2, 3 };
// 配列を引数に渡してリストを初期化
List<int> copiedList = new List<int>(originalArray);
// コレクション式ならスプレッド演算子も使える(C# 12~)
List<int> copiedList2 = [..originalArray];
Console.WriteLine($"Copied: {string.Join(", ", copiedList)}");
}
}
実行結果
Copied: 1, 2, 3
new List<int>(originalArray) のように、コンストラクタの引数に既存のコレクション(配列や他のリスト)を渡すと、その要素をすべてコピーした新しいリストが作られます。
元の配列とは別の実体になるため、リスト側を変更しても元の配列には影響しません。
2次元リスト(リストのリスト)の初期化
「行列」のようなデータを扱いたい場合、List<List<int>> のような入れ子構造(2次元リスト)を使います。
コレクション式を使った2次元リストの初期化
using System;
using System.Collections.Generic;
class Program
{
static void Main()
{
// 2次元リストの初期化
List<List<int>> matrix = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
];
Console.WriteLine($"[1][2]の値: {matrix[1][2]}");
}
}
実行結果
[1][2]の値: 6
C# 12のコレクション式を使えば、上記のようにJSONライクな直感的な記述で多次元リストを初期化できます。
以前の書き方(new List<List<int>> { new List<int> { ... } })に比べて、圧倒的に読みやすくなっています。
C#のスキルを活かして年収を上げる方法
以上、C#のListの初期化方法について解説してきました。
業務システム開発やアプリ開発、ゲーム開発において需要の高いC#を扱えるエンジニアは、転職によって数十万円の年収アップはザラで、100万円以上年収が上がることも珍しくありません。
なお、転職によって年収を上げたい場合は、エンジニア専門の転職エージェントサービスを利用するのが最適です。
転職エージェントも副業エージェントも、登録・利用は完全無料なので、どんな求人や副業案件があるのか気になる方は、気軽に利用してみるとよいでしょう。
| 年収アップにこだわりたい方 (平均アップ額138万円の実績) | テックゴー |
| 未経験・経験者問わず幅広く探したい方 | ユニゾンキャリア |
| 業界に精通した担当者に相談したい方 | キッカケエージェント |
| ゲーム業界への転職を志望する方 | ファミキャリ |
| エンジニア未経験からキャリアを築く方 | イーチキャリア |



