Initialiseurs de collections (Visual Basic)

Les initialiseurs de collections fournissent une syntaxe raccourcie qui vous permet de créer une collection et de la remplir avec un ensemble initial de valeurs. Les initialiseurs de collections sont utiles lorsque vous créez une collection à partir d’un ensemble de valeurs connues (par exemple, une liste d’options de menu ou de catégories, un ensemble initial de valeurs numériques, une liste statique de chaînes telles que des noms de jours ou de mois, ou des emplacements géographiques tels qu’une liste d’états utilisée pour la validation).

Pour plus d’informations sur les collections, consultez Collections.

Vous identifiez un initialiseur de collection à l’aide du mot clé From suivi d’accolades ({}). Cette syntaxe est similaire à la syntaxe des littéraux de tableau décrite dans Tableaux. Les exemples suivants montrent différentes manières d’utiliser des initialiseurs de collections pour créer des collections.

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

Notes

C# fournit également des initialiseurs de collections. Les initialiseurs de collections C# fournissent les mêmes fonctionnalités que les initialiseurs de collections Visual Basic. Pour plus d’informations sur les initialiseurs de collections C#, consultez Initialiseurs d’objets et de collections.

Syntaxe

Un initialiseur de collection se compose d’une liste de valeurs séparées par des virgules et placées entre accolades ({}), précédées par le mot clé From, comme illustré dans le code suivant.

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

Lorsque vous créez une collection, comme un List<T> ou un Dictionary<TKey,TValue>, vous devez fournir le type de collection avant l’initialiseur de collection, comme indiqué dans le code suivant.

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

Notes

Vous ne pouvez pas combiner un initialiseur de collection et un initialiseur d’objet pour initialiser le même objet de collection. Vous pouvez utiliser des initialiseurs d’objets pour initialiser des objets dans un initialiseur de collection.

Création d’une collection à l’aide d’un initialiseur de collection

Lorsque vous créez une collection à l’aide d’un initialiseur de collection, chaque valeur fournie dans l’initialiseur de collection est passée à la méthode Add appropriée de la collection. Par exemple, si vous créez un List<T> en utilisant un initialiseur de collection, chaque valeur de chaîne de l’initialiseur de collection est passée à la méthode Add. Si vous souhaitez créer une collection à l’aide d’un initialiseur de collection, le type spécifié doit être un type de collection valide. Les types de collections valides sont, par exemple, des classes qui implémentent l’interface IEnumerable<T> ou qui héritent de la classe CollectionBase. Le type spécifié doit également exposer une méthode Add qui répond aux critères suivants.

  • La méthode Add doit être disponible à partir de la portée dans laquelle l’initialiseur de collection est appelé. La méthode Add ne doit pas nécessairement être publique si vous utilisez l’initialiseur de collection dans un scénario où les méthodes non publiques de la collection sont accessibles.

  • La méthode Add doit être un membre d’instance ou un membre Shared de la classe de collection, ou une méthode d’extension.

  • Il doit exister une méthode Add pouvant être mise en correspondance, selon les règles de résolution de surcharge, avec les types fournis dans l’initialiseur de collection.

Ainsi, l’exemple de code suivant montre comment créer une collection List(Of Customer) à l’aide d’un initialiseur de collection. Lorsque le code est exécuté, chaque objet Customer est passé à la méthode Add(Customer) de la liste générique.

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

L’exemple de code suivant montre le code équivalent qui n’utilise pas d’initialiseur de collection.

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 collection a une méthode Add ayant des paramètres qui correspondent au constructeur de l’objet Customer, vous pouvez imbriquer des valeurs de paramètre pour la méthode Add dans les initialiseurs de collections, comme indiqué dans la section suivante. Si la collection n’a pas une telle méthode Add, vous pouvez en créer une comme méthode d’extension. Pour obtenir un exemple montrant comment créer une méthode Add comme méthode d’extension pour une collection, consultez Guide pratique pour créer une méthode d’extension Add utilisée par un initialiseur de collection. Pour obtenir un exemple montrant comment créer une collection personnalisée pouvant être utilisée avec un initialiseur de collection, consultez Guide pratique pour créer une collection utilisée par un initialiseur de collection.

Imbrication d’initialiseurs de collections

Vous pouvez imbriquer des valeurs dans un initialiseur de collection pour identifier une surcharge spécifique d’une méthode Add pour la collection qui est créée. Les valeurs passées à la méthode Add doivent être séparées par des virgules et placées entre accolades ({}), comme vous le feriez dans un littéral de tableau ou un initialiseur de collection.

Lorsque vous créez une collection à l’aide de valeurs imbriquées, chaque élément de la liste de valeurs imbriquée est passé comme argument à la méthode Add correspondant aux types d’éléments. Ainsi, l’exemple de code suivant crée un Dictionary<TKey,TValue> dans lequel les clés sont de type Integer et les valeurs sont de type String. Chacune des listes de valeurs imbriquées est mise en correspondance avec la méthode Add pour Dictionary.

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

L’exemple de code précédent est équivalent au code suivant.

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

Seules les listes de valeurs imbriquées du premier niveau d’imbrication sont envoyées à la méthode Add pour le type de collection. Les niveaux d’imbrication plus profonds sont traités comme des littéraux de tableau et les listes de valeurs imbriquées ne sont pas mises en correspondance avec la méthode Add de toute collection.

Intitulé Description
Comment : créer une méthode d'extension Add utilisée par un initialiseur de collection Montre comment créer une méthode d’extension appelée Add qui peut être utilisée pour renseigner une collection avec des valeurs d’un initialiseur de collection.
Guide pratique : créer une collection utilisée par un initialiseur de collection Montre comment activer l’utilisation d’un initialiseur de collection en incluant une méthode Add dans une classe de collection qui implémente IEnumerable.

Voir aussi