コレクション初期化子 (Visual Basic)

コレクション初期化子とは、コレクションを作成して一連の初期値を設定できる、短い構文です。 コレクション初期化子は、コレクションを既知の値のセットから作成する場合に便利です。値のセットの例として、メニュー オプションやカテゴリのリスト、数値の初期セット、曜日や月の名前の静的文字列のリスト、検証に使用する州のリストなどの地理的な場所が挙げられます。

コレクションの詳細については、「コレクション」を参照してください。

コレクション初期化子は、From キーワードの後に中かっこ ({}) を使用して指定できます。 これは、「配列」で説明する配列リテラルの構文と似ています。 次の例では、コレクション初期化子を使用してコレクションを作成するさまざまな方法を示します。

' 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"}}

Note

C# にもコレクション初期化子はあります。 C# のコレクション初期化子には、Visual Basic のコレクション初期化子と同じ機能があります。 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

Note

コレクション初期化子とオブジェクト初期化子を組み合わせて、同じコレクション オブジェクトを初期化することはできません。 コレクション初期化子内のオブジェクトを初期化するには、オブジェクト初期化子を使用します。

コレクション初期化子を使用してコレクションを作成する

コレクション初期化子を使用してコレクションを作成する場合、コレクション初期化子内の各値は、コレクション内の適切な 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 メソッドを作成する方法の例については、「方法: コレクション初期化子によって使用される Add 拡張メソッドを作成する」を参照してください。 コレクション初期化子で使用できるカスタム コレクションを作成する方法の例については、「方法: コレクション初期化子を使用してコレクションを作成する」を参照してください。

コレクション初期化子を入れ子にする

作成するコレクションの Add メソッドで固有のオーバーロードを指定するため、コレクション初期化子内の値を入れ子にすることができます。 Add メソッドに渡す値は、配列リテラルまたはコレクション初期化子の場合と同じように、コンマで区切り、中かっこ ({}) で囲む必要があります。

入れ子にした値でコレクションを作成する場合、入れ子になった値一覧の各要素は、要素の型に一致する Add メソッドに引数として渡されます。 たとえば、次のコード例では、キーは Integer 型で値は String 型の Dictionary<TKey,TValue> が作成されます。 一連の入れ子になった値は、それぞれ DictionaryAdd メソッドと照合されます。

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 メソッドとも照合されません。

Title 説明
方法: コレクション初期化子によって使用される Add 拡張メソッドを作成する コレクション初期化子の値をコレクションに入力するために使用できる Add と呼ばれる拡張メソッドを作成する方法を示します。
方法: コレクション初期化子によって使用されるコレクションを作成する IEnumerable を実装するコレクション クラスに Add メソッドを含めてコレクション初期化子を使用できるようにする方法を説明します。

関連項目