共用方式為


集合初始化器 (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/"))

如果集合具有一個其參數與 Add 物件建構函數相符的 Customer 方法,您可以將 Add 方法的參數值巢狀於集合初始化運算式內,如下一節所述。 如果集合沒有這類 Add 方法,您可以建立一個做為擴充方法。 如需如何建立 Add 方法做為集合擴充方法的範例,請參閱 如何:建立集合初始化表達式所使用的 Add Extension 方法。 如需如何建立可與集合初始化表達式搭配使用的自定義集合範例,請參閱 如何:建立集合初始化表達式所使用的集合

巢狀集合初始化表達式

您可以在集合初始化器中嵌套值,以識別所建立集合之 Add 方法的特定多載。 傳遞至 Add 方法的值必須以逗號分隔,並以大括弧括住,{}就像您在數位常值或集合初始化表達式中所做的一樣。

當您使用巢狀值建立集合時,巢狀值清單的每個項目都會當做自變數傳遞至 Add 符合項目類型的方法。 例如,下列程式代碼範例會建立Dictionary<TKey,TValue>,其中索引鍵的類型為Integer,而值的類型為String。 巢狀值清單中的每一個都會使用 Add 方法來匹配 Dictionary

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 Extension 方法 示範如何建立稱為 Add 的擴充方法,以使用集合初始化表達式的值填入集合。
如何:建立集合初始化運算式所使用的集合 如何在實作Add的集合類別中,通過包含IEnumerable方法來啟用集合初始化器的使用示範。

另請參閱