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. Los inicializadores de colección son útiles cuando se crea una colección a partir de un conjunto de valores conocidos, como 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ías o meses, o ubicaciones geográficas como una lista de estados usada para la validación.

Para más información sobre las colecciones, vea Colecciones.

Para identificar un inicializador de colección, use la palabra clave From seguida de llaves ({}). Esto es similar a la sintaxis de los literales de matriz que se describe en Arrays (Matrices). En los ejemplos siguientes se muestran varias maneras de usar 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 inicializadores de colección de Visual Basic. Para obtener más información sobre los inicializadores de colección de C#, vea Inicializadores de objeto y de colección.

Sintaxis

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

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

Cuando se crea una colección, como List<T> o Dictionary<TKey,TValue>, debe proporcionar el tipo de colección antes del 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 se puede combinar un inicializador de colección y un inicializador de objeto para inicializar el mismo objeto de colección. Puede usar inicializadores de objeto para inicializar objetos en un inicializador de colección.

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

Cuando crea una colección mediante un inicializador de colección, cada valor que se proporciona en el inicializador de colección se pasa al método Add correspondiente de la colección. Por ejemplo, si crea List<T> mediante un inicializador de colección, cada valor de cadena del inicializador de colección se pasa al método Add. Si quiere crear una colección mediante un inicializador de colección, el tipo especificado debe ser un tipo de colección válido. Las clases que implementan la interfaz IEnumerable<T> o que heredan la clase CollectionBase son algunos ejemplos de tipos de colección válidos. El tipo especificado también debe exponer un método Add que cumpla los criterios siguientes.

  • El método Add debe estar disponible en 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 en el que se puede obtener 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 asociar, en función de las reglas de resolución de sobrecarga, a los tipos que se proporcionan en el inicializador de colección.

Por ejemplo, en el ejemplo de código siguiente se muestra cómo se crea una colección List(Of Customer) mediante un inicializador de colección. Cuando se ejecuta el código, se pasa cada objeto Customer 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 que tiene parámetros que coinciden con el constructor para el objeto Customer, los valores de parámetro para el método Add se pueden anidar dentro de inicializadores de colección, como se describe en la sección siguiente. Si la colección no tiene un método Add, puede crear uno como un método de extensión. Para obtener un ejemplo de cómo crear un método Add como un método de extensión para una colección, vea How to: Create an Add Extension Method Used by a Collection Initializer (Cómo: Crear un método de extensión Add usado por un inicializador de colección). Para obtener un ejemplo de cómo crear una colección personalizada que pueda usarse con un inicializador de colección, vea How to: Create a Collection Used by a Collection Initializer (Cómo: Crear una colección usada por un inicializador de colección).

Anidar inicializadores de colección

Puede anidar los valores de 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 separarse con comas e incluirse entre llaves ({}), tal como se haría en un literal de matriz o un inicializador de colección.

Cuando se crea una colección mediante el uso de valores anidados, cada elemento de la lista de valores anidados se pasa como argumento al método Add que coincida con los tipos de elementos. Por ejemplo, en el ejemplo de código siguiente se crea un Dictionary<TKey,TValue> en que las claves son de tipo Integer y los valores son de tipo String. Cada una de las listas de valores anidados se asocia al método Add para el 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 se envían listas de valores anidados del primer nivel de anidamiento al método Add del tipo de colección. Los niveles de anidamiento más profundos se tratan como literales de matriz y no habrá coincidencias de las listas de valores anidados con el método Add de ninguna colección.

Title Descripción
Procedimiento para crear un método de extensión de adiciones usado por un inicializador de colección Muestra cómo crear un método de extensión denominado Add que se puede usar para rellenar una colección con los valores de un inicializador de colección.
Procedimiento para crear una colección usada por un inicializador de colección Muestra cómo habilitar el uso de un inicializador de colección mediante la inclusión de un método Add en una clase de colección que implementa IEnumerable.

Consulte también