Insamlingsinitierare (Visual Basic)

Samlingsinitieringarna ger en förkortad syntax som gör att du kan skapa en samling och fylla den med en inledande uppsättning värden. Samlingsinitierare är användbara när du skapar en samling från en uppsättning kända värden, till exempel en lista över menyalternativ eller kategorier, en inledande uppsättning numeriska värden, en statisk lista med strängar som dag- eller månadsnamn eller geografiska platser, till exempel en lista över tillstånd som används för validering.

Mer information om samlingar finns i Samlingar.

Du identifierar en insamlingsinitierare med hjälp av nyckelordet From följt av klammerparenteser ({}). Detta liknar matrisliteralsyntaxen som beskrivs i Matriser. I följande exempel visas olika sätt att använda insamlingsinitierare för att skapa samlingar.

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

Anteckning

C# innehåller även insamlingsinitierare. C#-insamlingsinitierare har samma funktioner som Visual Basic insamlingsinitierare. Mer information om C#-insamlingsinitierare finns i Initiatorer för objekt och samling.

Syntax

En samlingsinitierare består av en lista över kommaavgränsade värden som omges av klammerparenteser ({}), föregås av nyckelordet From , enligt följande kod.

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

När du skapar en samling, till exempel en List<T> eller en Dictionary<TKey,TValue>, måste du ange samlingstypen före insamlingsinitieraren, enligt följande kod.

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

Anteckning

Du kan inte kombinera både en samlingsinitierare och en objektinitierare för att initiera samma samlingsobjekt. Du kan använda objektinitierare för att initiera objekt i en samlingsinitierare.

Skapa en samling med hjälp av en insamlingsinitierare

När du skapar en samling med hjälp av en insamlingsinitiator skickas varje värde som anges i insamlingsinitiatorn till lämplig Add metod för samlingen. Om du till exempel skapar en List<T> med hjälp av en insamlingsinitiator skickas varje strängvärde i insamlingsinitiatorn till Add metoden. Om du vill skapa en samling med hjälp av en samlingsinitierare måste den angivna typen vara giltig samlingstyp. Exempel på giltiga samlingstyper är klasser som implementerar IEnumerable<T> gränssnittet eller ärver CollectionBase klassen. Den angivna typen måste också exponera en Add metod som uppfyller följande villkor.

  • Metoden Add måste vara tillgänglig från omfånget där insamlingsinitieraren anropas. Metoden Add behöver inte vara offentlig om du använder insamlingsinitieraren i ett scenario där icke-offentliga metoder för samlingen kan nås.

  • Metoden Add måste vara en instansmedlem eller Shared medlem i samlingsklassen eller en tilläggsmetod.

  • Det måste finnas en Add metod som kan matchas, baserat på regler för överbelastningsmatchning, med de typer som anges i insamlingsinitieraren.

I följande kodexempel visas till exempel hur du skapar en List(Of Customer) samling med hjälp av en samlingsinitierare. När koden körs skickas varje Customer objekt till metoden för den Add(Customer) allmänna listan.

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

I följande kodexempel visas motsvarande kod som inte använder en samlingsinitierare.

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

Om samlingen har en Add metod som har parametrar som matchar konstruktorn för Customer objektet kan du kapsla parametervärden för Add metoden i insamlingsinitierare, enligt beskrivningen i nästa avsnitt. Om samlingen inte har någon Add sådan metod kan du skapa en som tilläggsmetod. Ett exempel på hur du skapar en Add metod som tilläggsmetod för en samling finns i How to: Create an Add Extension Method Used by a Collection Initializer (Så här skapar du en tilläggsmetod som används av en insamlingsinitierare). Ett exempel på hur du skapar en anpassad samling som kan användas med en samlingsinitierare finns i Så här skapar du en samling som används av en insamlingsinitierare.

Kapsling av insamlingsinitierare

Du kan kapsla värden i en samlingsinitierare för att identifiera en specifik överlagring av en Add metod för samlingen som skapas. Värdena som skickas till Add metoden måste avgränsas med kommatecken och omges av klammerparenteser ({}), som du skulle göra i en matrisliteral eller samlingsinitiator.

När du skapar en samling med kapslade värden skickas varje element i den kapslade värdelistan som ett argument till den Add metod som matchar elementtyperna. I följande kodexempel skapas till exempel en Dictionary<TKey,TValue> där nycklarna är av typen Integer och värdena är av typen String. Var och en av de kapslade värdelistorna matchas med Add metoden för Dictionary.

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

Föregående kodexempel motsvarar följande kod.

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

Endast kapslade värdelistor från den första kapslingsnivån skickas till Add metoden för samlingstypen. Djupare nivåer av kapsling behandlas som matrisliteraler och de kapslade värdelistorna matchas inte med metoden för Add någon samling.

Rubrik Beskrivning
Anvisningar: Skapa en lägg till tilläggsmetod som används av en insamlingsinitierare Visar hur du skapar en tilläggsmetod med namnet Add som kan användas för att fylla i en samling med värden från en samlingsinitierare.
Anvisningar: Skapa en samling som används av en insamlingsinitierare Visar hur du aktiverar användning av en insamlingsinitierare genom att inkludera en Add metod i en samlingsklass som implementerar IEnumerable.

Se även