Generics разширяват мощността и гъвкавостта на VB.NET в много области, но получавате по-голяма полза от производителността и повече опции за програмиране в общото списък обект [Списък (от T)], отколкото при всеки друг.
Да използвам Списък (от T), трябва да разберете как да приложите многото методи, които предлага .NET Framework. По-долу са дадени три примера с използване За всеки, FindAll, и Вид, което показва как родовото списък класни работи.
Първата стъпка е да се създаде родово списък. Можете да получите данните по много начини, но най-простият е просто Добави то. Кодът по-долу показва как да класифицирам колекцията си от бира и вино!
Стартов код
Първо трябва да има предмет, който ще представлява бутилка от колекцията. В приложението за Windows Forms класът Form първо трябва да бъде във файл или дизайнерът на Visual Studio няма да работи правилно, така че поставете това в края:
Бутилка за обществена класа Публична марка като струнен. Публично име като низ. Публична категория като низ. Публичен размер като десетичен. Обществен под нов (_. ByVal m_Brand As String, _. ByVal m_Name As String, _. ByVal m_Category As String, _. ByVal m_Size като десетичен) Марка = m_Brand. Име = m_Name. Категория = m_Категория. Размер = m_Размер. Край Sub. Краен клас
За да изградите колекцията, Добави предметите. Това е, което е в Натоварване на формуляра събитие:
Димен шкаф като списък (на бутилка) = _. „Нов списък (на бутилка) Кабинет. Добавяне (Нова бутилка (_. "Castle Creek", _. "Uintah Blanc", _. "Вино", 750)) Кабинет. Добавяне (Нова бутилка (_. "Zion Canyon Brewing Company", _. "Springdale Amber Ale", _. „Бира“, 355)) Кабинет. Добавяне (Нова бутилка (_. "Испански долини лозя", _. "Сира", _. "Вино", 750)) Кабинет. Добавяне (Нова бутилка (_. "Бира Wasatch", _. "Полигамия Портър", _. „Бира“, 355)) Кабинет. Добавяне (Нова бутилка (_. "Бира клякане", _. "Provo Girl Pilsner", _. „Бира“, 355))
Всички горепосочени кодове са стандартен код във VB.NET 1.0. Имайте предвид обаче, че като дефинирате своя собствена бутилка обект, вие получавате предимствата на няколко типа в една и съща колекция (в случая и двете низ и десетичен) и ефективно, тип безопасно „късно свързване“.
Пример за ForEach
Забавлението започва, когато използваме методите. За начало, нека да приложим познатото За всеки метод. Документацията на Microsoft включва тази дефиниция на синтаксиса на използване:
Dim екземпляр като списък Dim действие като действие (Of T). ForEach (действие)
Microsoft допълнително дефинира действие като „делегирайте на метод, който извършва действие върху предадения на него обект. Елементите на текущия списък (T) се предават индивидуално на делегата на Action (T). "
Бакшиш: За повече информация за делегатите, прочетете Използване на делегати във Visual Basic .NET за гъвкавост по време на работа.
Първото нещо, което трябва да кодирате, е методът, който ще бъде делегиран. Неразбирането на тази ключова точка е източникът на най-много на объркването на VB.NET студенти. Тази функция или подпрограма е мястото, където се извършва цялото персонализирано кодиране за обекти от тип "Of".
Когато се изпълнява правилно, по същество сте готови. Наистина е просто в този първи пример. Цял екземпляр на бутилка се предава и подпрограмата избира всичко необходимо от нея. Кодиране на За всеки също е просто. Просто попълнете адреса на делегата, като използвате AddressOf метод.
Sub displayBottle (ByVal b като бутилка) ResultList. Предмети. Добавяне (_ b. Марка & "-" & _ b. Име & "-" & _ b. Категория & "-" & _ b. Размер) Край Sub Private Sub ForEachButton_Click (... ResultList. Предмети. Изчисти () Резултатен списък. Предмети. Добавете ("За всеки пример") ResultList. Предмети. Добавете ("") кабинет. ForEach (AddressOf displayBottle) End Sub
Пример за FindAll
FindAll е малко по-сложно. Документацията на Microsoft за FindAll изглежда така:
Dim instance As List Dim съответства като Predicate (Of T) Dim returnValue As List (Of T) returnValue = екземпляр. FindAll (съвпадение)
Този синтаксис включва нов елемент, Предикат (от T). Според Microsoft това ще представлява метода ", който определя набор от критерии и определя дали посоченият обект отговаря на тези критерии. "С други думи, можете да създадете всеки код, който ще намери нещо в списък. Кодирах моята Предикат (от T) за да намерите нещо в "Бирата" категория.
Вместо да извиквате делегиращия код за всеки елемент от списъка, FindAll връща цяло Списък (T) съдържащи само съвпаденията, които са резултат от вашия Предикат (от T). От вашия код зависи и двете да дефинират тази секунда Списък (T) и направете нещо с него. Моят код просто добавя елементите към a ListBox.
Частен Sub FindAllButton_Click (ByVal подател като система. Обект, ByVal e като система. EventArgs) обработва FindAllButton. Кликнете върху ResultList. Предмети. Изчисти () Резултатен списък. Предмети. Добавете („FindAll Example“) ResultList. Предмети. Добавете ("") димен подпис като списък (на бутилка) под списък = кабинет. FindAll (AddressOf findBeer) за всеки r като бутилка в подпис ResultList. Предмети. Добавяне (_ r. Марка & "-" & _ r. Име & "-" & _ r. Категория & "-" & _ r. Размер) Следващ край Подфункция findBeer (ByVal b като бутилка) _ As Boolean If (b. Категория = "Бира") След това върнете True Else Return False End ако приключи функция
Пример за сортиране
Последният метод, който разглежда тази статия, е Вид. Отново Microsoft използва някаква терминология, с която може да не сте запознати. Всъщност има четири различни претоварвания на Вид метод:
- Вид()
- Сортиране (IComparer (T))
- Сортиране (Сравнение (T))
- Сортиране (Int32, Int32, IComparer (T))
Това ви позволява да използвате методи за сортиране, дефинирани в .NET Framework за списъка, да кодирате свой собствен, да използвате система определено сравнение за типа или сортиране на част от колекцията, като се използва начална позиция и брой параметър.
В този пример, тъй като използвам следния синтаксис за действително изпълнение на сорта, използвам третото претоварване.
х. Name.x. Name. СравниTo (у. Name) (ш. Name)
Кодирал съм друг делегат на моя сравнител. Тъй като искам да сортирам по моя име, Изваждам точно тази стойност от всеки екземпляр на бутилка обект, който е предаден и използвайте Сортиране (Сравнение )>)). Най- Вид метод всъщност пренарежда оригинала Списък (T). Това се обработва след изпълнение на метода.
Частен Sub SortButton_Click (ByVal подател като система. Обект, ByVal e като система. EventArgs) Дръжки SortButton. Кликнете върху ResultList. Предмети. Изчисти () Резултатен списък. Предмети. Добавяне („Сортиране на пример“) ResultList. Предмети. Добавете ("") кабинет. Сортиране (AddressOf sortCabinet) за всеки r като бутилка в кабинета ResultList. Предмети. Добавяне (_ r. Име & "-" & _ r. Марка & "-" & _ r. Категория & "-" & _ r. Размер) Следващ край Под частна споделена функция sortCabinet (_ ByVal x като бутилка, ByVal y като бутилка) като цяло връщане x. Name. СравниTo (у. Име) Крайна функция
Тези методи бяха избрани, за да демонстрират основните начини, по които рамковите методи Списък (T) всъщност са кодирани. Има обаче цял сал от други методи. Това е, което прави Списък (T) толкова полезно!