Udostępnij za pomocą


Inicjalizatory kolekcji (Visual Basic)

Inicjatory kolekcji zapewniają skróconą składnię, która umożliwia tworzenie kolekcji i wypełnianie 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 dnia lub miesiąca, 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ć, używając słowa kluczowego From , a następnie nawiasów klamrowych ({}). Jest to podobne do składni literału tablicy, która jest opisana w 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 / Notatka

Język C# udostępnia również inicjatory kolekcji. Inicjatory kolekcji języka C# zapewniają takie same funkcje jak inicjatory kolekcji języka 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 List<T> lub Dictionary<TKey,TValue>, należy podać typ kolekcji przed inicjatorem kolekcji, co zostało pokazane 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 / Notatka

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 obiekt List<T> 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ż udostępnić metodę Add, która spełnia następujące kryteria.

  • Metoda Add musi być dostępna w zakresie, 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 niepublicznych metod kolekcji.

  • Metoda Add musi być elementem wystąpienia lub członkiem klasy kolekcji Shared, albo metodą rozszerzeń.

  • Metoda Add musi istnieć, która może być zgodna, na podstawie reguł 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órej parametry odpowiadają konstruktorowi obiektu Customer, można zagnieżdżać wartości parametrów metody Add w inicjatorach kolekcji, jak opisano w następnej sekcji. Jeśli kolekcja nie ma takiej Add metody, możesz ją utworzyć jako metodę rozszerzającą. Aby uzyskać przykład, jak utworzyć metodę Add jako metodę rozszerzenia dla kolekcji, zobacz temat Jak utworzyć metodę rozszerzenia "Add", 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 (Jak utworzyć kolekcję używaną przez inicjator kolekcji).

Zagnieżdżanie inicjatorów kolekcji

Tworząc kolekcję, można zagnieżdżać wartości w jej inicjatorze, aby zidentyfikować konkretne przeciążenie metody Add. Wartości przekazane do metody Add muszą być rozdzielone przecinkami i ujęte w nawiasy klamrowe {}, podobnie jak w literał tablicy lub inicjalizator kolekcji.

Podczas tworzenia kolekcji przy użyciu wartości zagnieżdżonych każdy element listy zagnieżdżonych wartości jest przekazywany jako argument do Add metody zgodnej z typami elementów. Na przykład poniższy przykład kodu tworzy 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 Dictionary elementu.

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 listy wartości z pierwszego poziomu zagnieżdżenia są przekazywane do metody Add 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.

Nazwa Opis
Instrukcje: tworzenie metody dodawania 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 Pokazuje, jak włączyć używanie inicjatora kolekcji przez dołączenie metody Add w klasie kolekcji, która implementuje IEnumerable.

Zobacz także