ホームに戻る
出典 :
オブジェクト初期化子とコレクション初期化子 - C# プログラミング ガイド - C# | Microsoft Learn
関連 :
コレクション [C#]プロパティ [C#]オブジェクト初期化子とinitアクセサ [C#]レコード [C++]一様初期化 [C++]デフォルトメンバ初期化子 [C++]コンストラクタ初期化子
目次 :

コレクション初期化子

IEnumerable インタフェースを実装するコレクションを初期化する際に、1つ以上の要素にまとめて初期値を割り当てることができる。
オブジェクト初期化子と似た概念である。

基本的な例

List<int> digits = new List<int> { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
上記は単純な List の初期化の例で、初期値をコレクション初期化子として渡している。
これにより、複数の要素を1行で初期化することができる。
なお上記のコードは以下と等価で、Add() の繰り返しが自動化される。
List<int> digits = new List<int>(); digits.Add( 0 ); digits.Add( 1 ); digits.Add( 2 ); digits.Add( 3 ); digits.Add( 4 ); digits.Add( 5 ); digits.Add( 6 ); digits.Add( 7 ); digits.Add( 8 ); digits.Add( 9 );

オブジェクト初期化子との組み合わせ

コレクションの要素がオブジェクトの場合、コレクション初期化子の要素にオブジェクト初期化子を含めることができる。
オブジェクト初期化子とinitアクセサを参照のこと。
public class Cat { // init アクセサが定義されたプロパティ public int Age { get; init; } public string? Name { get; init; } public Cat() { } } : { // コレクション初期化子を用いた cats の初期化 // (要素はカンマで区切られている) List<Cat> cats = new List<Cat> { new Cat { Name = "Sylvester", Age = 8 } , new Cat { Name = "Whiskers", Age = 2 } , new Cat { Name = "Sasha", Age = 14 } }; }

要素が null を含む場合

コレクションの Add() メソッドが 引数として null を取れる場合、コレクション初期化子に null を含めることができる。
// null 許容型 List List<Cat?> moreCats = new List<Cat?> { new Cat { Name = "Furrytail", Age = 5 } , new Cat { Name = "Peaches", Age = 4 } , null };

インデクス(キー値)を指定できる場合

Dictionary など、インデクス(キー値)を指定できる場合は以下のように記述できる。
var numbers = new Dictionary<int, string> { [7] = "seven" , [9] = "nine" , [13] = "thirteen" };
これは以下のコードと等価で、Dictionary のプロパティ Item[TKey] への代入が行われる。
var numbers = new Dictionary<int, string>(); numbers.Item[7] = "seven"; numbers.Item[9] = "nine"; numbers.Item[13] = "thirteen";
また、以下のようにも記述できる。これは List と同様 Add(TKey, TValue) を繰り返す。
var numbers = new Dictionary<int, string> { { 7 , "seven" }, { 9 , "nine" }, { 13, "thirteen" } };

コレクションが読み取り専用の場合

以下のコードはオブジェクト初期化子とコレクション初期化子を組み合わせている。
不正なコード
// 読み取り専用コレクションを含む CatOwner クラス public class CatOwner { // プロパティ Cats は get のみが定義されている public IList<Cat> Cats { get; } = new List<Cat>(); } : { CatOwner owner = new CatOwner { // 読み取り専用の Cats に新しい List を割り当てようとしている ⇒ エラー Cats = new List<Cat> { new Cat{ Name = "Sylvester", Age = 8 }, new Cat{ Name = "Whiskers" , Age = 2 }, new Cat{ Name = "Sasha" , Age = 14 } } }; }
ここでは CatOwner 型オブジェクトの初期化時にコレクション初期化子を用いているが、対象となるプロパティ Cats は読み取り専用であり、新しい List を割り当てることができない。
この場合、new List<Cat> を省略することで対応できる。
修正したコード
: { CatOwner owner = new CatOwner { // new List<Cat> を省略 Cats = { new Cat{ Name = "Sylvester", Age = 8 }, new Cat{ Name = "Whiskers" , Age = 2 }, new Cat{ Name = "Sasha" , Age = 14 } } }; }