コレクション初期化子の概要 (Visual Basic)
コレクション初期化子は、コレクションを作成し、そのコレクションに初期値を設定するための簡略された構文を提供します。 コレクション初期化子は、コレクションを既知の値のセットから作成する場合に便利です。値のセットの例として、メニュー オプションやカテゴリのリスト、数値の初期セット、曜日や月の名前の静的文字列のリスト、検証に使用する都道府県リストなどの地理的な場所が挙げられます。
コレクション初期化子は、From キーワードの後に中かっこ ({}) を使用して指定します。 この構文は、「Visual Basic における配列」に説明されている配列リテラル構文に似ています。 コレクションの作成のためにコレクション初期化子を使用する各種の方法を次の例に示します。
' Create an array of type String().
Dim winterMonths = {"December", "January", "February"}
' Create an array of type Integer()
Dim numbers = {1, 2, 3, 4, 5}
' Create a list of menu options. (Requires an extension method
' named Add for List(Of MenuOption)
Dim menuOptions = New List(Of MenuOption) From {{1, "Home"},
{2, "Products"},
{3, "News"},
{4, "Contact Us"}}
注意
C# にも、コレクション初期化子があります。 C# のコレクション初期化子の機能は、Visual Basic のコレクション初期化子の機能と同じです。 C# のコレクション初期化子の詳細については、「オブジェクト初期化子とコレクション初期化子 (C# プログラミング ガイド)」を参照してください。
構文
コレクション初期化子は、次のコードに示すように、From キーワードの後に、コンマ区切りの値を中かっこ ({}) で囲んだリストから構成されます。
Dim names As New List(Of String) From {"Christa", "Brian", "Tim"}
List<T> や Dictionary<TKey, TValue> などのコレクションを作成する場合、次のコードに示すように、コレクション初期化子の前にコレクション型を指定する必要があります。
Public Class AppMenu
Public Property Items As List(Of String) =
New List(Of String) From {"Home", "About", "Contact"}
End Class
注意
コレクション初期化子とオブジェクト初期化子を組み合わせて、同じコレクション オブジェクトを初期化することはできません。 オブジェクト初期化子を使用して、コレクション初期化子内のオブジェクトを初期化できます。
コレクション初期化子を使用したコレクションの作成
コレクション初期化子を使用してコレクションを作成する場合、コレクション初期化子に指定された各値は、コレクションの該当する Add メソッドに渡されます。 たとえば、コレクション初期化子を使用して List<T> を作成する場合、コレクション初期化子の各文字列値は、Add メソッドに渡されます。 コレクション初期化子を使用してコレクションを作成する場合、指定する型は、有効なコレクション型である必要があります。 有効なコレクション型の例には、IEnumerable<T> インターフェイスを実装するクラスや、CollectionBase クラスを継承するクラスなどがあります。 指定する型は、次の条件を満たす Add メソッドを公開する必要もあります。
Add メソッドは、コレクション初期化子の呼び出し元の範囲から使用できる必要があります。 コレクションの非パブリック メソッドにアクセスできるシナリオでコレクション初期化子を使用する場合、Add メソッドはパブリックである必要はありません。
Add メソッドは、コレクション クラスのインスタンス メンバーまたは Shared メンバーであるか、拡張メソッドである必要があります。
オーバーロード解決規則に基づいて、コレクション初期化子で提供される型に対応付けることができる Add メソッドが存在する必要があります。
例として、コレクション初期化子を使用して List(Of Customer) コレクションを作成する方法を次のコード例に示します。 コードの実行時、各 Customer オブジェクトはジェネリック リストの Add(Customer) メソッドに渡されます。
Dim customers = New List(Of Customer) From
{
New Customer("City Power & Light", "http://www.cpandl.com/"),
New Customer("Wide World Importers", "http://www.wideworldimporters.com/"),
New Customer("Lucerne Publishing", "http://www.lucernepublishing.com/")
}
次のコード例に、同等の内容でコレクション初期化子を使用しない方法を示します。
Dim customers = New List(Of Customer)
customers.Add(New Customer("City Power & Light", "http://www.cpandl.com/"))
customers.Add(New Customer("Wide World Importers", "http://www.wideworldimporters.com/"))
customers.Add(New Customer("Lucerne Publishing", "http://www.lucernepublishing.com/"))
Customer オブジェクトのコンストラクターと一致するパラメーターがある Add メソッドがコレクションにある場合、次のセクションで説明するように、Add メソッドのパラメーター値は、コレクション初期化子内で入れ子にすることができます。 コレクションに Add メソッドがない場合、拡張メソッドとしてメソッドを作成できます。 コレクションに拡張メソッドとして Add メソッドを作成する方法の例については、「方法: コレクション初期化子で使用される拡張メソッドを作成または追加する (Visual Basic)」を参照してください。 コレクション初期化子内で使用できるカスタム コレクションを作成する方法の例については、「方法: コレクション初期化子を使用してコレクションを作成する (Visual Basic)」を参照してください。
入れ子になったコレクション初期化子
作成するコレクションの Add メソッドの固有のオーバーロードを識別するため、コレクション初期化子内の値を入れ子にすることができます。 Add メソッドに渡される値は、配列リテラルやコレクション初期化子に指定する場合と同様に、コンマ区切りにして中かっこ ({}) で囲む必要があります。
入れ子にした値を使用してコレクションを作成する場合、入れ子にされた値リストの各要素は、要素型と一致する Add メソッドに引数として渡されます。 例として、Dictionary<TKey, TValue> を作成し、このキーを Integer 型にし、値を String 型にするコードを次に示します。 入れ子にされた値リストの各値は、Dictionary の Add メソッドに照合されます。
Dim days = New Dictionary(Of Integer, String) From
{{0, "Sunday"}, {1, "Monday"}}
上のコード例は、次のコードと同じ結果になります。
Dim days = New Dictionary(Of Integer, String)
days.Add(0, "Sunday")
days.Add(1, "Monday")
入れ子にされた値リストは、入れ子の最初のレベルからのみコレクション型の Add メソッドに送られます。 入れ子の最初のレベルより下のレベルは、配列リテラルとして扱われ、入れ子にされた値リストはコレクションの Add メソッドに照合されません。
参照
処理手順
方法: コレクション初期化子で使用される拡張メソッドを作成または追加する (Visual Basic)
方法: コレクション初期化子を使用してコレクションを作成する (Visual Basic)