集合初始值设定项 (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 扩展方法。 有关如何创建可用于集合初始值设定项的自定义集合的示例,请参阅如何:创建集合初始值设定项使用的集合

嵌套集合初始值设定项

可以在集合初始值设定项中嵌套值,从而标识要创建的集合的 Add 方法重载。 传递给 Add 方法的值必须用逗号隔开,并用大括号 ({}) 括住,就像在数组文本或集合初始值设定项中一样。

使用嵌套值创建集合时,嵌套值的每个元素都会作为参数传递到与元素类型匹配的 Add 方法中。 例如,下面的代码示例创建 Dictionary<TKey,TValue>,其中键类型为 Integer,值类型为 String。 每个嵌套值列表与 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 方法,从而启用集合初始值设定项。

另请参阅