Инициализаторы коллекций (Visual Basic)Collection Initializers (Visual Basic)

Инициализаторы набора предлагают сокращенный синтаксис для создания коллекций и заполнения их начальным набором значений.Collection initializers provide a shortened syntax that enables you to create a collection and populate it with an initial set of values. Инициализаторы набора полезны при создании коллекции из набора известных значений и ее последующей проверки. Это может быть список команд меню или категорий, исходный набор числовых значений, статический список строк, например названий дней или месяцев либо географических расположений (список штатов), и многое другое.Collection initializers are useful when you are creating a collection from a set of known values, for example, a list of menu options or categories, an initial set of numeric values, a static list of strings such as day or month names, or geographic locations such as a list of states that is used for validation.

Более подробную информацию о коллекциях см. в статье Коллекции.For more information about collections, see Collections.

Инициализатор набора определяется по ключевому слову From, за которым следуют фигурные скобки ({}).You identify a collection initializer by using the From keyword followed by braces ({}). Это похоже на синтаксис литерала массива, описанный в разделе Массивы.This is similar to the array literal syntax that is described in Arrays. Следующие примеры демонстрируют различные способы применения инициализаторов для создания коллекций.The following examples show various ways to use collection initializers to create collections.

' 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# also provides collection initializers. Инициализаторы набора в C# предлагают те же функциональные возможности, что и в Visual Basic.C# collection initializers provide the same functionality as Visual Basic collection initializers. Подробнее об инициализаторах набора C# см. в разделе Инициализаторы объекта и набора.For more information about C# collection initializers, see Object and Collection Initializers.

СинтаксисSyntax

Инициализатор набора состоит из списка разделенных запятыми и заключенных в фигурные скобки ({}) значений, которым предшествует ключевое слово From, как показано в следующем примере кода.A collection initializer consists of a list of comma-separated values that are enclosed in braces ({}), preceded by the From keyword, as shown in the following code.

Dim names As New List(Of String) From {"Christa", "Brian", "Tim"}

При создании коллекции, например List<T> или Dictionary<TKey,TValue>, перед инициализатором набора необходимо указать тип коллекции, как показано в следующем примере кода.When you create a collection, such as a List<T> or a Dictionary<TKey,TValue>, you must supply the collection type before the collection initializer, as shown in the following code.

Public Class AppMenu
    Public Property Items As List(Of String) =
        New List(Of String) From {"Home", "About", "Contact"}
End Class

Примечание

Не допускается одновременно использовать инициализатор и набора и объекта для инициализации одного и того же объекта коллекции.You cannot combine both a collection initializer and an object initializer to initialize the same collection object. Инициализаторы объекта можно использовать для инициализации объектов в инициализаторе набора.You can use object initializers to initialize objects in a collection initializer.

Создание коллекции с помощью инициализатора коллекцииCreating a Collection by Using a Collection Initializer

При создании коллекции с помощью инициализатора набора каждое указываемое в инициализаторе значение передается в соответствующий метод Add коллекции.When you create a collection by using a collection initializer, each value that is supplied in the collection initializer is passed to the appropriate Add method of the collection. Например, при создании List<T> с помощью инициализатора набора строковое значение в инициализаторе передается методу Add.For example, if you create a List<T> by using a collection initializer, each string value in the collection initializer is passed to the Add method. Если вы хотите создать коллекцию с помощью инициализатора набора, следует указать допустимый тип коллекции.If you want to create a collection by using a collection initializer, the specified type must be valid collection type. Примеры допустимых типов коллекций — классы, которые реализуют интерфейс IEnumerable<T> или наследуют от класса CollectionBase.Examples of valid collection types include classes that implement the IEnumerable<T> interface or inherit the CollectionBase class. Указанный тип должен также предоставлять метод Add, отвечающий следующим условиям.The specified type must also expose an Add method that meets the following criteria.

  • Метод Add должен быть доступен из области, в которой вызывается инициализатор набора.The Add method must be available from the scope in which the collection initializer is being called. Если инициализатор набора применяется в сценарии, в котором допускается обращение к методам коллекции, не являющимся открытыми, метод Add не должен обязательно быть открытым.The Add method does not have to be public if you are using the collection initializer in a scenario where non-public methods of the collection can be accessed.

  • Метод Add должен быть членом экземпляра или членом Shared класса коллекции либо методом расширения.The Add method must be an instance member or Shared member of the collection class, or an extension method.

  • Должен существовать метод Add, который может сопоставляться на основе правил разрешения перегрузки с типами, предоставляемыми в инициализаторе набора.An Add method must exist that can be matched, based on overload resolution rules, to the types that are supplied in the collection initializer.

В следующем примере кода показано, как создать с помощью инициализатора набора коллекцию List(Of Customer).For example, the following code example shows how to create a List(Of Customer) collection by using a collection initializer. При выполнении кода каждый объект Customer передается методу Add(Customer) универсального списка.When the code is run, each Customer object is passed to the Add(Customer) method of the generic list.

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/")
    }

В следующем примере кода показан эквивалентный код, в котором инициализатор набора не используется.The following code example shows equivalent code that does not use a collection initializer.

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 можно вложить в инициализаторы набора, как описывается в следующем разделе.If the collection has an Add method that has parameters that match the constructor for the Customer object, you could nest parameter values for the Add method within collection initializers, as discussed in the next section. Если у коллекции такого метода Add нет, его можно создать как метод расширения.If the collection does not have such an Add method, you can create one as an extension method. Пример создания метода Add как метода расширения для коллекции см. в разделе Практическое руководство. Создание метода расширения Add, используемого инициализатором набора.For an example of how to create an Add method as an extension method for a collection, see How to: Create an Add Extension Method Used by a Collection Initializer. Пример создания настраиваемой коллекции, которую можно использовать с инициализатором набора, см. в разделе Практическое руководство. Создание коллекции, используемой инициализатором набора.For an example of how to create a custom collection that can be used with a collection initializer, see How to: Create a Collection Used by a Collection Initializer.

Инициализаторы набора с вложениямиNesting Collection Initializers

В инициализатор набора можно вкладывать значения, чтобы указать конкретную перегрузку метода Add для создаваемой коллекции.You can nest values within a collection initializer to identify a specific overload of an Add method for the collection that is being created. Значения, передаваемые методу Add, должны быть разделены запятыми и заключены в фигурные скобки ({}) так же, как в литерале массива или инициализаторе набора.The values passed to the Add method must be separated by commas and enclosed in braces ({}), like you would do in an array literal or collection initializer.

При создании коллекции с помощью вложенных значений каждый элемент списка вложенных значений передается в качестве аргумента методу Add, который соответствует типам элементов.When you create a collection by using nested values, each element of the nested value list is passed as an argument to the Add method that matches the element types. В следующем примере кода создается коллекция Dictionary<TKey,TValue>, в которой ключи относятся к типу Integer, а значения — к типу String.For example, the following code example creates a Dictionary<TKey,TValue> in which the keys are of type Integer and the values are of type String. Каждый из списков вложенных значений сопоставляется с методом Add для Dictionary.Each of the nested value lists is matched to the Add method for the Dictionary.

Dim days = New Dictionary(Of Integer, String) From
    {{0, "Sunday"}, {1, "Monday"}}

Предыдущий пример кода эквивалентен следующему коду.The previous code example is equivalent to the following code.

Dim days = New Dictionary(Of Integer, String)
days.Add(0, "Sunday")
days.Add(1, "Monday")

Методу Add типа коллекции передаются только списки вложенных значений первого уровня вложения.Only nested value lists from the first level of nesting are sent to the Add method for the collection type. Более глубокие уровни вложения обрабатываются как литералы массива, а списки вложенных значений не сопоставляются с методом Add ни в одной из коллекций.Deeper levels of nesting are treated as array literals and the nested value lists are not matched to the Add method of any collection.

ЗаголовокTitle ОписаниеDescription
Практическое руководство. Создание метода расширения Add, используемого инициализатором набораHow to: Create an Add Extension Method Used by a Collection Initializer Описывает создание метода расширения Add, который можно использовать для заполнения коллекции значениями из инициализатора набора.Shows how to create an extension method called Add that can be used to populate a collection with values from a collection initializer.
Практическое руководство. Создание коллекции, используемой инициализатором набораHow to: Create a Collection Used by a Collection Initializer Описывает, как активировать использование инициализатора набора, включив метод Add в класс коллекции, реализующий IEnumerable.Shows how to enable use of a collection initializer by including an Add method in a collection class that implements IEnumerable.

См. также:See also