Поделиться через


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

Инициализаторы набора предоставляют сокращенный синтаксис, позволяющий создавать коллекцию и населять ее начальным набором значений.Инициализаторы наборов полезны при создании коллекции из набора известных значений, например из списка команд меню или категорий, исходного набора числовых значений, статического списка строк, таких как названия дней или месяцев либо географических названий (например, список штатов), который используется для проверки.

Дополнительные сведения о коллекциях см. в разделе Коллекции (C# и Visual Basic).

Инициализатор набора определяется по ключевому слову From, за которым следуют фигурные скобки ({}).Это напоминает синтаксис литерала массива, описанный в разделе Массивы в Visual Basic.Следующие примеры демонстрируют различные способы применения инициализаторов наборов для создания коллекций.

' 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# см. в разделе Инициализаторы объектов и коллекций (Руководство по программированию в 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, используемого инициализатором набора (Visual Basic).Пример создания пользовательской коллекции, которая могла бы использоваться совместно с инициализатором набора, см. в разделе Практическое руководство. Создание коллекции, используемой инициализатором набора (Visual Basic).

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

В инициализатор набора можно вложить значения, чтобы указать конкретную перегрузку метода 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, используемого инициализатором набора (Visual Basic)

Показывает, как создать метод расширения Add это можно использовать для заполнения коллекции значениями из инициализатора набора.

Практическое руководство. Создание коллекции, используемой инициализатором набора (Visual Basic)

Показано, как включить использование инициализаторов набора, включив Add метод в классе, который реализует интерфейс коллекции IEnumerable.

См. также

Задачи

Практическое руководство. Инициализация переменной массива в Visual Basic

Практическое руководство. Создание списка элементов

Ссылки

Оператор New (Visual Basic)

Основные понятия

Инициализаторы объектов: именованные и анонимные типы (Visual Basic)

Автоматически реализуемые свойства (Visual Basic)

Вывод локального типа (Visual Basic)

Анонимные типы (Visual Basic)

Знакомство с LINQ в Visual Basic

Другие ресурсы

Коллекции (C# и Visual Basic)

Массивы в Visual Basic