Información general de los inicializadores de colección (Visual Basic)

Los inicializadores de colección proporcionan una sintaxis abreviada que permite crear una colección y rellenarla con un conjunto inicial de valores. Este tipo de inicializadores son útiles cuando se crea una colección a partir de un conjunto de valores conocidos como, por ejemplo, una lista de opciones de menú o categorías, un conjunto inicial de valores numéricos, una lista estática de cadenas (como nombres de día o mes), o ubicaciones geográficas (por ejemplo, una lista de estados que se usa con fines de validación).

Un inicializador de colección se identifica mediante la palabra clave From seguida de llaves ({}). Esta sintaxis es similar a la sintaxis de literales de matriz descrita en Matrices en Visual Basic. En los siguientes ejemplos se muestran varias formas de usar los inicializadores de colección para crear colecciones.

' 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"}}

Nota

C# también proporciona inicializadores de colección. Los inicializadores de colección de C# proporcionan la misma funcionalidad que los de Visual Basic. Para obtener más información acerca de los inicializadores de colección de C#, vea Inicializadores de objeto y de colección (Guía de programación de C#).

Sintaxis

Un inicializador de colección está formado por una lista de valores separados por comas que se encierran entre llaves ({}) precedida por la palabra clave From, como se muestra en el código siguiente.

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

Al crear una colección, como un objeto List<T> o Dictionary<TKey, TValue>, debe proporcionar el tipo de colección antes que el inicializador de colección, como se muestra en el código siguiente.

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

Nota

No puede combinar un inicializador de colección y un inicializador de objeto para inicializar el mismo objeto de colección. Puede utilizar los inicializadores de objeto para inicializar objetos en un inicializador de colección.

Crear una colección mediante un inicializador de colección

Al crear una colección mediante un inicializador de colección, cada uno de los valores que se proporciona en el inicializador de colección se pasa al método Add adecuado de la colección. Por ejemplo, si se crea un objeto List<T> mediante un inicializador de colección, cada valor de cadena del inicializador de colección se pasa al método Add. Si desea crear una colección mediante un inicializador de colección, se debe especificar un tipo de colección válido. Entre los ejemplos de tipos de colección válidos se incluyen las clases que implementan la interfaz IEnumerable<T> o que heredan la clase CollectionBase. El tipo especificado también debe exponer un método Add que cumpla los siguientes criterios.

  • El método Add debe estar disponible desde el ámbito en el que se llama al inicializador de colección. El método Add no tiene que ser público si el inicializador de colección se usa en un escenario donde se puede tener acceso a los métodos no públicos de la colección.

  • El método Add debe ser un miembro de instancia o un miembro Shared de la clase de colección o bien un método de extensión.

  • Debe existir un método Add que se pueda corresponder con los tipos proporcionados en el inicializador de colección, en función de reglas de resolución de sobrecarga.

Así, en el ejemplo de código siguiente se muestra cómo crear una colección List(Of Customer) mediante un inicializador de colección. Al ejecutar el código, cada uno de los objetos Customer se pasa al método Add(Customer) de la lista genérica.

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

En el ejemplo de código siguiente se muestra código equivalente que no usa un inicializador de colección.

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

Si la colección tiene un método Add con parámetros que coinciden con el constructor para el objeto Customer, se pueden anidar los valores de parámetro del método Add dentro de los inicializadores de colección, tal como se explica en la sección siguiente. Si la colección no tiene este tipo de método Add, se puede crear uno como método de extensión. Para obtener un ejemplo de cómo crear un método Add como método de extensión para una colección, vea Cómo: Crear un método de extensión Add usado por un inicializador de colección (Visual Basic). Para obtener un ejemplo de cómo crear una colección personalizada que se pueda usar con un inicializador de colección, vea Cómo: Crear una colección usada por un inicializador de colección (Visual Basic).

Anidar inicializadores de colección

Se pueden anidar los valores en un inicializador de colección para identificar una sobrecarga específica de un método Add para la colección que se va a crear. Los valores pasados al método Add deben estar separados por comas y encerrarse entre llaves ({}), tal y como se haría en un literal de matriz o un inicializador de colección.

Al crear una colección con valores anidados, cada uno de los elementos de la lista de valores anidados se pasa como argumento al método Add que coincide con los tipos de elemento. Así, en el ejemplo de código siguiente se crea un objeto Dictionary<TKey, TValue> en el que las claves son de tipo Integer y los valores son de tipo String. Cada una de las listas de valores anidados se corresponde con el método Add del objeto Dictionary.

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

El ejemplo de código anterior es equivalente al código siguiente.

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

Solo las listas de valores anidados del primer nivel de anidamiento se envían al método Add para el tipo de colección. Los niveles más profundos de anidamiento se tratan como literales de matriz y las listas de valores anidados no se corresponden con el método Add de ninguna colección.

Vea también

Tareas

Cómo: Crear un método de extensión Add usado por un inicializador de colección (Visual Basic)

Cómo: Crear una colección usada por un inicializador de colección (Visual Basic)

Cómo: Inicializar variables de matriz en Visual Basic

Cómo: Crear una lista de elementos

Referencia

New (Operador, Visual Basic)

Conceptos

Matrices en Visual Basic

Inicializadores de objeto: Tipos con nombre y anónimos (Visual Basic)

Propiedades implementadas automáticamente (Visual Basic)

Inferencia de tipo de variable local (Visual Basic)

Tipos anónimos (Visual Basic)

Introducción a LINQ en Visual Basic