Buscar y contar numeros repetidos en distintos ListView

Iniciado por dont'Exist, 8 Agosto 2019, 21:46 PM

0 Miembros y 1 Visitante están viendo este tema.

dont'Exist

Buenas tardes, estoy atascado.

Estoy tratando de hacer un programa que me muestre, en un ListView, todos los numeros que aparezcan en otros 3 ListView donde tengo numero repartidos 3 ListView distintos (los 3 con 6 filas)

Lo graficaré un poco:



     ListView1                                    ListView2                                      ListView3
 Posicion / Numero                               Posicion / Numero                              Posicion / Numero
    1            3                                1            2                                  1            3
    2            7                                2            6                                  2            2
    3            7                                3            6                                  3            9
    4            2                                4            3                                  4            9
    5            6                                5            2                                  5            7
    6            7                                6            6                                  6            7


      ListView4
Numero  /  Cantidad
    2            4
    3            3
    6            4
    7            5
    9            2


Bueno, algo así. En donde en el ListView4 es donde estará los numero que aparecen y la cantidad.

Yo intenté anidando varios FOR pero la verdad es que me hice un lío.

Espero que me puedan entender el ejemplo y si me pueden orientar, les agradecería.
Saludos

Eleкtro

#1
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.



Código (vbnet) [Seleccionar]
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.