Puedes utilizar
LINQ de la siguiente manera para simplificar el uso de varios búcles/For. De todas formas, todo resultaría más dinámico si en lugar de un
ListView adaptases tu código para utilizar un
DataGridView enlazando datos de origen en la propiedad
DataGridView.DataSource.
Public Class Form1
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim columnIndex As Integer = 0
' Unión entre las colecciones de elementos de ListView1, ListView2 y ListView3.
Dim items As ListViewItem() =
({Me.ListView1.Items.Cast(Of ListViewItem),
Me.ListView2.Items.Cast(Of ListViewItem),
Me.ListView3.Items.Cast(Of ListViewItem)
}.SelectMany(Function(sequence) sequence)
).ToArray()
' Agrupación de los elementos mediante pares de clave-valor (clave=texto del elemento, valor=cantidad de repeticiones).
Dim groups As KeyValuePair(Of String, Integer)() =
(From item As ListViewItem In items
Let key As String = item.SubItems(columnIndex).Text
Order By key Ascending
Group By key Into keys = Group
Select New KeyValuePair(Of String, Integer)(key, keys.Count())
).ToArray()
' Creación de nuevos elementos para añadir en el ListView4.
Dim newItems As ListViewItem() =
(From group As KeyValuePair(Of String, Integer) In groups
Select New ListViewItem({group.Key, CStr(group.Value)})
).ToArray()
' Adición de los nuevos elementos al ListView4.
With Me.ListView4
.BeginUpdate()
.Items.Clear()
.Items.AddRange(newItems)
.EndUpdate()
End With
End Sub
End Class
Nótese que en la linea nº 21 del código de arriba, si lo prefieres puedes cambiar el tipo de retorno para devolver un array del tipo
ListViewItem directamente.
Saludos.