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


Инициализаторы коллекции (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"}

При создании коллекции, например a List<T> или a 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 методу, который соответствует типам элементов. Например, в следующем примере кода создается 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.

См. также