Inicializátory kolekcí (Visual Basic)

Inicializátory kolekce poskytují zkrácenou syntaxi, která umožňuje vytvořit kolekci a naplnit ji počáteční sadou hodnot. Inicializátory kolekcí jsou užitečné při vytváření kolekce ze sady známých hodnot, například seznamu možností nabídky nebo kategorií, počáteční sady číselných hodnot, statického seznamu řetězců, jako jsou názvy dnů nebo měsíců, nebo zeměpisné umístění, jako je seznam stavů, které se používají k ověření.

Další informace o kolekcích najdete v tématu Kolekce.

Inicializátor kolekce identifikujete pomocí klíčového From slova následovaného složenými závorkami ({}). Podobá se syntaxi literálu pole, která je popsaná v polích. Následující příklady ukazují různé způsoby použití inicializátorů kolekcí k vytváření kolekcí.

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

Poznámka

Jazyk C# také poskytuje inicializátory kolekcí. Inicializátory kolekcí jazyka C# poskytují stejné funkce jako inicializátory kolekcí Visual Basic. Další informace o inicializátorech kolekcí jazyka C# najdete v tématu Inicializátory objektů a kolekcí.

Syntax

Inicializátor kolekce se skládá ze seznamu hodnot oddělených čárkami, které jsou uzavřeny do závorek ({}), před klíčovým slovem From , jak je znázorněno v následujícím kódu.

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

Když vytvoříte kolekci, například kolekci List<T> nebo Dictionary<TKey,TValue>a, musíte zadat typ kolekce před inicializátorem kolekce, jak je znázorněno v následujícím kódu.

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

Poznámka

Nelze kombinovat inicializátor kolekce i inicializátor objektů pro inicializaci stejného objektu kolekce. Inicializátory objektů můžete použít k inicializaci objektů v inicializátoru kolekce.

Vytvoření kolekce pomocí inicializátoru kolekce

Při vytváření kolekce pomocí inicializátoru kolekce se každá hodnota zadaná v inicializátoru kolekce předá příslušné Add metodě kolekce. Pokud například vytvoříte List<T> inicializátor kolekce, předá se metodě každá řetězcová hodnota v inicializátoru Add kolekce. Pokud chcete vytvořit kolekci pomocí inicializátoru kolekce, musí být zadaný typ platného typu kolekce. Příklady platných typů kolekcí zahrnují třídy, které implementují IEnumerable<T> rozhraní nebo dědí CollectionBase třídu. Zadaný typ musí také vystavit metodu Add , která splňuje následující kritéria.

  • Metoda Add musí být dostupná z oboru, ve kterém se volá inicializátor kolekce. Metoda Add nemusí být veřejná, pokud používáte inicializátor kolekce ve scénáři, kdy k nepřístupným metodám kolekce je možné získat přístup.

  • Metoda Add musí být členem instance nebo Shared členem třídy kolekce nebo metodou rozšíření.

  • Musí Add existovat metoda, která se dá shodovat na základě pravidel překladu přetížení k typům zadaným v inicializátoru kolekce.

Například následující příklad kódu ukazuje, jak vytvořit List(Of Customer) kolekci pomocí inicializátoru kolekce. Při spuštění kódu se každý Customer objekt předá Add(Customer) metodě obecného seznamu.

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

Následující příklad kódu ukazuje ekvivalentní kód, který nepoužívá inicializátor kolekce.

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

Pokud kolekce obsahuje metodu Add , která má parametry, které odpovídají konstruktoru objektu Customer , můžete vnořit hodnoty parametrů pro metodu Add v inicializátorech kolekcí, jak je popsáno v další části. Pokud kolekce takovou metodu Add nemá, můžete ji vytvořit jako metodu rozšíření. Příklad Add vytvoření metody jako metody rozšíření pro kolekci najdete v tématu Postupy: Vytvoření metody přidání rozšíření používané inicializátorem kolekce. Příklad vytvoření vlastní kolekce, která se dá použít s inicializátorem kolekce, najdete v tématu Postupy: Vytvoření kolekce používané inicializátorem kolekce.

Inicializátory vnoření kolekce

Hodnoty můžete vnořit do inicializátoru kolekce, abyste identifikovali konkrétní přetížení Add metody pro vytvořenou kolekci. Hodnoty předané Add metodě musí být oddělené čárkami a uzavřeny do závorek ({}), jako byste to udělali v literálu pole nebo inicializátoru kolekce.

Při vytváření kolekce pomocí vnořených hodnot se každý prvek vnořeného seznamu hodnot předá jako argument Add metodě, která odpovídá typům elementů. Například následující příklad kódu vytvoří Dictionary<TKey,TValue> , ve kterém jsou klíče typu Integer a hodnoty jsou typu String. Každý seznam vnořených hodnot se shoduje s metodou pro danou metodu AddDictionary.

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

Předchozí příklad kódu je ekvivalentní následujícímu kódu.

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

Do metody pro typ kolekce se odesílají Add pouze vnořené seznamy hodnot z první úrovně vnoření. Hlubší úrovně vnoření se považují za literály matice a seznamy vnořených hodnot se neshodují s Add metodou žádné kolekce.

Nadpis Popis
Postupy: Vytvoření metody přidání rozšíření používané inicializátorem kolekce Ukazuje, jak vytvořit metodu rozšíření s názvem Add , která se dá použít k naplnění kolekce hodnotami z inicializátoru kolekce.
Postupy: Vytvoření kolekce používané inicializátorem kolekce Ukazuje, jak povolit použití inicializátoru kolekce zahrnutím Add metody do třídy kolekce, která implementuje IEnumerable.

Viz také