Inicjatory kolekcji (Visual Basic)

Inicjatory kolekcji zapewniają skróconą składnię, która umożliwia utworzenie kolekcji i wypełnienie jej początkowym zestawem wartości. Inicjatory kolekcji są przydatne podczas tworzenia kolekcji na podstawie zestawu znanych wartości, na przykład listy opcji menu lub kategorii, początkowego zestawu wartości liczbowych, statycznej listy ciągów, takich jak nazwy dni lub miesięcy, lub lokalizacji geograficznych, takich jak lista stanów używanych do walidacji.

Aby uzyskać więcej informacji na temat kolekcji, zobacz Kolekcje.

Inicjator kolekcji można zidentyfikować przy użyciu słowa kluczowego From , a następnie nawiasów klamrowych ({}). Jest to podobne do składni literału tablicy opisanej w temacie Tablice. W poniższych przykładach pokazano różne sposoby używania inicjatorów kolekcji do tworzenia kolekcji.

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

Uwaga

Język C# udostępnia również inicjatory kolekcji. Inicjatory kolekcji języka C# zapewniają takie same funkcje jak inicjatory kolekcji Visual Basic. Aby uzyskać więcej informacji na temat inicjatorów kolekcji języka C#, zobacz Inicjatory obiektów i kolekcji.

Składnia

Inicjator kolekcji składa się z listy wartości rozdzielanych przecinkami, które są ujęte w nawiasy klamrowe ({}), poprzedzone From słowem kluczowym, jak pokazano w poniższym kodzie.

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

Podczas tworzenia kolekcji, takiej jak lub List<T>Dictionary<TKey,TValue>, należy podać typ kolekcji przed inicjatorem kolekcji, jak pokazano w poniższym kodzie.

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

Uwaga

Nie można połączyć inicjatora kolekcji i inicjatora obiektów w celu zainicjowania tego samego obiektu kolekcji. Inicjatory obiektów umożliwiają inicjowanie obiektów w inicjatorze kolekcji.

Tworzenie kolekcji przy użyciu inicjatora kolekcji

Podczas tworzenia kolekcji przy użyciu inicjatora kolekcji każda wartość podana w inicjatorze kolekcji jest przekazywana do odpowiedniej Add metody kolekcji. Jeśli na przykład utworzysz List<T> obiekt przy użyciu inicjatora kolekcji, każda wartość ciągu w inicjatorze kolekcji zostanie przekazana Add do metody . Jeśli chcesz utworzyć kolekcję przy użyciu inicjatora kolekcji, określony typ musi być prawidłowym typem kolekcji. Przykłady prawidłowych typów kolekcji obejmują klasy, które implementują IEnumerable<T> interfejs lub dziedziczą klasę CollectionBase . Określony typ musi również uwidocznić metodę spełniającą Add następujące kryteria.

  • Metoda Add musi być dostępna z zakresu, w którym wywoływany jest inicjator kolekcji. Metoda Add nie musi być publiczna, jeśli używasz inicjatora kolekcji w scenariuszu, w którym można uzyskać dostęp do metod innych niż publiczne kolekcji.

  • Metoda Add musi być członkiem wystąpienia lub Shared członkiem klasy kolekcji lub metodą rozszerzenia.

  • Metoda Add musi istnieć, która może być dopasowywana w oparciu o reguły rozpoznawania przeciążenia, do typów dostarczonych w inicjatorze kolekcji.

Na przykład poniższy przykład kodu pokazuje, jak utworzyć List(Of Customer) kolekcję przy użyciu inicjatora kolekcji. Po uruchomieniu kodu każdy Customer obiekt jest przekazywany do Add(Customer) metody listy ogólnej.

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

Poniższy przykład kodu przedstawia równoważny kod, który nie używa inicjatora kolekcji.

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

Jeśli kolekcja ma metodę Add , która ma parametry zgodne z konstruktorem Customer obiektu, można zagnieżdżać wartości parametrów dla Add metody w inicjatorach kolekcji, zgodnie z opisem w następnej sekcji. Jeśli kolekcja nie ma takiej metody, możesz utworzyć tę metodę Add jako metodę rozszerzenia. Przykład tworzenia Add metody jako metody rozszerzenia dla kolekcji można znaleźć w temacie How to: Create an Add Extension Method Used by a Collection Initializer (Jak utworzyć metodę dodawania rozszerzenia używaną przez inicjator kolekcji). Aby zapoznać się z przykładem tworzenia kolekcji niestandardowej, która może być używana z inicjatorem kolekcji, zobacz How to: Create a Collection Used by a Collection Initializer (Instrukcje: tworzenie kolekcji używanej przez inicjator kolekcji).

Zagnieżdżanie inicjatorów kolekcji

Wartości w inicjatorze kolekcji można zagnieżdżać, aby zidentyfikować określone przeciążenie Add metody dla tworzonej kolekcji. Wartości przekazane do Add metody muszą być oddzielone przecinkami i ujęte w nawiasy klamrowe ({}), tak jak w literału tablicy lub inicjatorze kolekcji.

Podczas tworzenia kolekcji przy użyciu wartości zagnieżdżonych każdy element listy wartości zagnieżdżonych jest przekazywany jako argument do Add metody zgodnej z typami elementów. Na przykład poniższy przykład kodu tworzy typ Dictionary<TKey,TValue> , w którym klucze są typu Integer , a wartości są typu String. Każda z zagnieżdżonych list wartości jest dopasowywana do Add metody dla elementu Dictionary.

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

Poprzedni przykład kodu jest odpowiednikiem następującego kodu.

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

Tylko zagnieżdżone listy wartości z pierwszego poziomu zagnieżdżenia są wysyłane do Add metody dla typu kolekcji. Głębsze poziomy zagnieżdżania są traktowane jako literały tablicy, a zagnieżdżone listy wartości nie są dopasowywane do Add metody żadnej kolekcji.

Tytuł Opis
Instrukcje: tworzenie i dodawanie metody rozszerzenia używanej przez inicjator kolekcji Pokazuje, jak utworzyć metodę rozszerzenia o nazwie Add , która może służyć do wypełniania kolekcji wartościami z inicjatora kolekcji.
Instrukcje: tworzenie kolekcji używanej przez inicjator kolekcji Przedstawia sposób włączania używania inicjatora kolekcji przez uwzględnienie Add metody w klasie kolekcji, która implementuje IEnumerableelement .

Zobacz też