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. MetodaAdd
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 neboShared
č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.
Související témata
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 . |