Buenas.
1. Las preguntas sobre VB.NET van en el foro de programación .NET.
2. A pesar de que la pregunta que has formulado se puede y se debería considerar una pregunta vaga a la que no se te debería responder, puesto que podrías haber buscado en Google para encontrar miles de resultados... pero estuve mirando algunos de esos resultados para indicarte algún enlace, y lo cierto es que no me gustó ninguna de las soluciones (feas y poco óptimas) que se pueden encontrar en Google, así que aquí tienes una solución que he desarrollado basada en extensiones de método y con soporte para tipos genéricos:
Namespace ListBoxExtensions
''' ----------------------------------------------------------------------------------------------------
''' <summary>
''' Contains custom extension methods to use with <see cref="ListBox"/> control.
''' </summary>
''' ----------------------------------------------------------------------------------------------------
<HideModuleName>
Public Module ListBoxExtensions
#Region " Public Extension Methods "
''' ----------------------------------------------------------------------------------------------------
''' <summary>
''' Removes items of the specified type in the source <see cref="ListBox"/> given a condition.
''' </summary>
''' ----------------------------------------------------------------------------------------------------
''' <typeparam name="T">
''' The <see cref="Type"/> of items to remove.
''' </typeparam>
'''
''' <param name="sender">
''' The source <see cref="ListBox"/>.
''' </param>
'''
''' <param name="predicate">
''' A <see cref="Func(Of T, Boolean)"/> function to test each element for a condition.
''' </param>
''' ----------------------------------------------------------------------------------------------------
<DebuggerStepThrough>
<Extension>
<EditorBrowsable(EditorBrowsableState.Always)>
Public Sub RemoveItems(Of T)(ByVal sender As ListBox, ByVal predicate As Func(Of T, Boolean))
Dim collection As ListBox.
ObjectCollection = sender.
Items Dim indices As New Stack(Of Integer)
For index
As Integer = 0 To (collection.
Count - 1) If (TypeOf obj Is T) AndAlso (predicate.Invoke(DirectCast(obj, T))) Then
indices.Push(index)
End If
Next index
sender.BeginUpdate()
sender.SelectedIndex = -1
Do While (indices.Any())
Loop
sender.EndUpdate()
indices = Nothing
End Sub
''' ----------------------------------------------------------------------------------------------------
''' <summary>
''' Removes any empty string items (<see cref="String.Empty"/>) in the source <see cref="ListBox"/>.
''' </summary>
''' ----------------------------------------------------------------------------------------------------
''' <param name="sender">
''' The source <see cref="ListBox"/>.
''' </param>
''' ----------------------------------------------------------------------------------------------------
<DebuggerStepThrough>
<Extension>
<EditorBrowsable(EditorBrowsableState.Always)>
Public Sub RemoveEmptyStrings(ByVal sender As ListBox)
Dim predicate As Func(Of String, Boolean) =
Function(str As String) As Boolean
Return String.IsNullOrEmpty(str)
End Function
ListBoxExtensions.RemoveItems(Of String)(sender, predicate)
End Sub
''' ----------------------------------------------------------------------------------------------------
''' <summary>
''' Removes any empty string items (<see cref="String.Empty"/>)
''' and also string items that consists only of white-space characters in the source <see cref="ListBox"/>.
''' </summary>
''' ----------------------------------------------------------------------------------------------------
''' <param name="sender">
''' The source <see cref="ListBox"/>.
''' </param>
''' ----------------------------------------------------------------------------------------------------
<DebuggerStepThrough>
<Extension>
<EditorBrowsable(EditorBrowsableState.Always)>
Public Sub RemoveEmptyOrWhiteSpaceStrings(ByVal sender As ListBox)
Dim predicate As Func(Of String, Boolean) =
Function(str As String) As Boolean
Return String.IsNullOrWhiteSpace(str)
End Function
ListBoxExtensions.RemoveItems(Of String)(sender, predicate)
End Sub
#End Region
End Module
End Namespace
Modo de empleo para eliminar cadenas de texto vacías (String.Empty):
Me.ListBox1.Items.AddRange({"1", "2", "3", "", String.Empty, "4", "5"})
ListBoxExtensions.RemoveEmptyStrings(Me.ListBox1)
Modo de empleo para eliminar cadenas de texto vacías (String.Empty) y cadenas de texto que solo consistan en espacios en blanco:
Me.ListBox1.Items.AddRange({"1", "2", "3", "", String.Empty, " ", "4", "5"})
ListBoxExtensions.RemoveEmptyOrWhiteSpaceStrings(Me.ListBox1)
Modo de empleo para eliminar items de un tipo específico que cumplan cierta condición:
Me.ListBox1.Items.AddRange({Color.Red, Color.Green, Color.Blue})
Dim predicate As Func(Of Color, Boolean) =
Function(c As Color) (c = Color.Green)
ListBoxExtensions.RemoveItems(Of Color)(Me.ListBox1, predicate)
Por último, recuerda que puedes importar el espacio de nombres para simplificar el uso de las extensiones de método:
Imports Namespace_Principal.ListBoxExtensions
...
Dim lb As ListBox = Me.ListBox1
lb.RemoveEmptyStrings()
lb.RemoveEmptyOrWhiteSpaceStrings()
lb.RemoveItems(Of Type)(Predicate)
...y que para el método
RemoveItems(Of T) siempre puedes declarar una función a nivel de clase y utilizar el operador
AddressOf:
Public Class TestClass
Private Sub Metodo()
Dim lb As ListBox = Me.ListBox1
lb.Items.AddRange({Color.Red, Color.Green, Color.Blue})
ListBoxExtensions.RemoveItems(Of Color)(lb, AddressOf Me.ColorPredicate)
End Sub
Private Function ColorPredicate(ByVal c As Color) As Boolean
Select Case c
Case Color.Green
Return True
Case Else
Return False
End Select
End Function
End Class