La lista genérica útil en VB.NET

Los genéricos extienden el poder y la flexibilidad de VB.NET en muchas áreas, pero obtienes un mayor beneficio de rendimiento y más opciones de programación en el genérico Lista objeto [Lista (de T)] que con cualquier otro.

Usar Lista (de T), debe comprender cómo implementar los muchos métodos que proporciona .NET Framework. A continuación hay tres ejemplos usando Para cada, Encuentra todos, y Ordenar, eso demuestra cómo el genérico Lista trabajos de clase.

El primer paso es crear un genérico Lista. Puede obtener los datos de muchas maneras, pero la más simple es simplemente Añadir eso. El siguiente código muestra cómo clasificar mi colección de cerveza y vino.!

Código de inicio

Primero debe haber un objeto que represente una botella de la colección. En una aplicación de Windows Forms, la clase Form primero tiene que estar en un archivo o el diseñador de Visual Studio no funcionará correctamente, así que ponga esto al final:

 Botella de clase pública Marca pública como cadena Nombre público como cadena Categoría pública como cadena Tamaño público como decimal público Sub nuevo (_ ByVal m_Brand como cadena, _ ByVal m_Name como cadena, _ ByVal m_Categoría como cadena, _ ByVal m_Size como decimal) Marca = m_Brand Nombre = m_Name Categoría = m_Category Tamaño = m_Size End Sub End Class 

Para construir la colección, Añadir Los artículos. Esto es lo que hay en el Carga de formulario evento:

 Dim Cabinet As List (Of Bottle) = _ "New List (Of Bottle) Cabinet.Add (New Bottle (_" Castle Creek ", _" Uintah Blanc ", _" Wine ", 750)) Cabinet.Add (New Bottle (_ "Zion Canyon Brewing Company", _ "Springdale Amber Ale", _ "Beer", 355)) Gabinete. Agregue (Botella nueva (_ "Spanish Valley Vineyards", _ "Syrah", _ "Wine", 750) ) Gabinete.Agregar (Botella nueva (_ "Wasatch Beers", _ "Polygamy Porter", _ "Beer", 355)) Gabinete.Agregar (Botella nueva (_ "Squatters Beer", _ "Provo Girl Pilsner", _ " Cerveza ", 355)) 

Todo el código anterior es código estándar en VB.NET 1.0. Sin embargo, tenga en cuenta que al definir su propio Botella objeto, obtienes los beneficios de múltiples tipos en la misma colección (en este caso, ambos Cuerda y Decimal) y eficiente, escriba "encuadernación tardía" segura.

Por cada ejemplo

La diversión comienza cuando usamos los métodos. Para comenzar, implementemos lo familiar Para cada método. La documentación de Microsoft incluye esta definición de sintaxis de uso:

Dim instancia como List Dim action As Action (Of T) instance.ForEach (action)

Microsoft define además acción como "delegar a un método que realiza una acción sobre el objeto que se le pasa. Los elementos de la Lista (T) actual se pasan individualmente al delegado de Acción (T)".

Propina: Para obtener más información sobre los delegados, lea Uso de delegados en Visual Basic .NET para la flexibilidad en tiempo de ejecución.

Lo primero que debe codificar es el método que se delegará. La incomprensión de este punto clave es la fuente de más de la confusión de los estudiantes de VB.NET. Esta función, o subrutina, es donde se realiza toda la codificación personalizada para los objetos de tipo "De".

Cuando se realiza correctamente, ya está hecho. Es realmente simple en este primer ejemplo. Una instancia completa de la Botella se pasa y la subrutina selecciona todo lo necesario fuera de ella. Codificando el Para cada en sí mismo es simple también. Simplemente complete la dirección del delegado usando el Dirección de método.

Sub displayBottle (ByVal b As Bottle) ResultList.Items.Add (_ b.Brand & "-" & _ b.Name & "-" & _ b.Category & "-" & _ b.Size) End Sub Private Sub ForEachButton_Click (… ResultList.Items.Clear () ResultList.Items.Add ("Para cada ejemplo") ResultList.Items.Add ("--------------------- - ") Cabinet.ForEach (AddressOf displayBottle) End Sub

Ejemplo de FindAll

Encuentra todos Es un poco más complicado. La documentación de Microsoft para Encuentra todos Se ve como esto:

Dim instancia Como Lista Dim match Como Predicado (Of T) Dim returnValue As List (Of T) returnValue = instance.FindAll (match)

Esta sintaxis incluye un nuevo elemento., Predicado (de T). Según Microsoft, esto representará el método "que define un conjunto de criterios y determina si el objeto especificado cumple con esos criterios". En otras palabras, puede crear cualquier código que encuentre algo en la lista. Codifiqué mi Predicado (de T) encontrar algo en la "cerveza" Categoría.

En lugar de llamar al código de delegado para cada elemento de la lista, Encuentra todos devuelve un entero Lista (T) que contiene solo las coincidencias que resultan de su Predicado (de T). Depende de su código definir ambos en este segundo Lista (T) y hacer algo con eso. Mi código solo agrega los elementos a un Cuadro de lista.

Private Sub FindAllButton_Click (remitente ByVal como System.Object, ByVal e As System.EventArgs) maneja FindAllButton.Click ResultList.Items.Clear () ResultList.Items.Add ("FindAll Example") ResultList.Items.Add ("--- -------------------- ") Dim sublist As List (Of Bottle) sublist = Cabinet.FindAll (AddressOf findBeer) Para cada r As Bottle In sublist ResultList.Items. Agregue (_ r.Brand & "-" & _ r.Name & "-" & _ r.Category & "-" & _ r.Size) Next End Sub Function findBeer (ByVal b As Bottle) _ As Boolean If ( b.Category = "Beer") Luego devuelve True Else Devuelve False End If End Function

Ordenar ejemplo

El método final que examina este artículo es Ordenar. Nuevamente, Microsoft usa alguna terminología con la que quizás no esté familiarizado. En realidad, hay cuatro sobrecargas diferentes de Ordenar método:

  • Ordenar()
  • Ordenar (IComparer (T))
  • Ordenar (Comparación (T))
  • Ordenar (Int32, Int32, IComparer (T))

Esto le permite usar los métodos de clasificación definidos en .NET Framework para la lista, codificar los suyos, usar una comparación definida por el sistema para el tipo u ordenar parte de la colección utilizando una posición inicial y un parámetro de recuento.

En este ejemplo, como uso la siguiente sintaxis para realizar el ordenamiento, estoy usando la tercera sobrecarga.

x.Name.x.Name.CompareTo (y.Name) (y.Name)

He codificado otro delegado a mi propio comparador. Como quiero ordenar por mi Nombre, Extraigo solo ese valor de cada instancia de la Botella objeto que se pasa y usa el Ordenar (Comparación<(Of )>)). los Ordenar método realmente reorganiza el original Lista (T). Eso es lo que se procesa después de ejecutar el método..

Private Sub SortButton_Click (remitente ByVal como System.Object, ByVal e As System.EventArgs) Maneja SortButton.Click ResultList.Items.Clear () ResultList.Items.Add ("Sort Example") ResultList.Items.Add ("--- -------------------- ") Cabinet.Sort (AddressOf sortCabinet) para cada r como botella en el gabinete ResultList.Items.Add (_ r.Name &" - ​​" & _ r.Brand & "-" & _ r.Category & "-" & _ r.Size) Próximo Fin Sub Función Privada Compartida sortCabinet (_ ByVal x As Bottle, ByVal y As Bottle) Como Entero Devuelve x.Name. CompareTo (y.Name) Función final

Estos métodos fueron seleccionados para demostrar las principales formas en que los métodos del Marco en Lista (T) En realidad están codificados. Sin embargo, hay toda una serie de otros métodos. Eso es lo que hace Lista (T) tan útil!