Инициализаторы коллекций (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 . |
См. также раздел
- Коллекции
- Массивы
- Инициализаторы объектов: именованные и анонимные типы
- Создание оператора
- Автоматически реализуемые свойства
- How to: Initialize an Array Variable in Visual Basic (Практическое руководство. Инициализация переменной массива в Visual Basic)
- Вывод локального типа
- Анонимные типы
- Introduction to LINQ in Visual Basic (Знакомство с LINQ в Visual Basic)
- Практическое руководство. Создание списка элементов