次の方法で共有


コレクション初期化子 (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"}}

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

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

コレクション初期化子を使用したコレクションの作成

コレクション初期化子を使用してコレクションを作成すると、コレクション初期化子で指定された各値がコレクションの適切な 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 メソッドに引数として渡されます。 たとえば、次のコード例では、キーが 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 メソッドと一致しません。

タイトル 説明
方法: コレクション初期化子によって使用される拡張メソッドの追加を作成する コレクション初期化子の値をコレクションに設定するために使用できる Add という拡張メソッドを作成する方法を示します。
方法: コレクション初期化子によって使用されるコレクションを作成する IEnumerableを実装するコレクション クラスにAdd メソッドを含めることで、コレクション初期化子の使用を有効にする方法を示します。

こちらも参照ください