Инициализаторы коллекций (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. Каждый из списков вложенных значений сопоставляется с методом 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, который можно использовать для заполнения коллекции значениями из инициализатора набора.
Практическое руководство. Создание коллекции с помощью инициализатора набора Описывает, как активировать использование инициализатора набора, включив метод Add в класс коллекции, реализующий IEnumerable.

См. также раздел