Eliminar duplicados o repetidos

Iniciado por luis456, 27 Abril 2015, 15:08 PM

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

luis456

Hola a todos
bueno aca estoy de nuevo :) con mis rollos

no encuentro la manera de eliminar datos repetidos he puesto por todos lados pero no me filtra los registros repetidos se como hacerlo con variables pero como aca pongo todas las variables juntas en un testbox ;( me da ese fallo

01 02 03 04 05 06 07 08 09
01 02 03 04 05 06 07 08 09




Código (vbnet) [Seleccionar]
Dim Lnumbers As List(Of IEnumerable(Of Integer)) = { SM18, SM17, SM16, SM14....,}.Distinct.ToList


     For Each col As IEnumerable(Of Integer) In Lnumbers



           ListBox23.Items.Add(String.Join(", ", From value As Integer In col
                                                                     Select If(value.ToString.Length = 1I,
                                                                               value.ToString.Insert(0I, "0"c),
                                                                               value.ToString)))
       Next col




Luis
Que tu sabiduria no sea motivo de Humillacion para los demas

Eleкtro

#1
Una forma de hacerlo sería utilizando la clausura Where para evaluar si la colección contiene el mismo elemento más de una vez, otra forma sería utilizar la clausura Group By para agrupar por números y luego seleccionar el primer elemento de la agrupación (Enumerable.First) con la claúsura Select (evitando así duplicados).

Where Clause (Visual Basic) - MSDN
Group By Clause (Visual Basic) - MSDN

Saludos








luis456

Cita de: Eleкtro en 27 Abril 2015, 16:37 PM
Una forma de hacerlo sería utilizando la clausura Where para evaluar si la colección contiene el mismo elemento más de una vez, otra forma sería utilizar la clausura Group By para agrupar por números y luego seleccionar el primer elemento de la agrupación (Enumerable.First) con la claúsura Select (evitando así duplicados).

Where Clause (Visual Basic) - MSDN
Group By Clause (Visual Basic) - MSDN

Saludos


Hola  corrigeme en algo. tendria que pasar el contenido del tesbox a una variable para poder hacer el filtrado ?

luis


Que tu sabiduria no sea motivo de Humillacion para los demas

Eleкtro

Tienes que modificar la query de LINQ que estás utilizando en el código de arriba, pero añadiéndole las clausulas necesarias para evitar duplicados.

Es facil. En las urls que te mostré tienes ejemplos.

Sigo sin ver que lo hayas intentado.

Saludos








luis456


"Sigo sin ver que lo hayas intentado ".

No es eso es que estoy pasando unas formulas jejej y he ido de pasada, no he tenido tiempo de miralo con detenimiento ahora estoy mas urgido de pasar esas formulas que tienen que ver con la pregunta pero primero acabare pasarlas :)

luis
Que tu sabiduria no sea motivo de Humillacion para los demas

luis456

Bueno creo que solo naci para las tuercas ;)

trato con los ejemplos que hay en las paginas de msdn que me pasaste pero aparte que no hablo chino jeje tengo que usar el traductor que habla como indio y me enredo mas y estos ejemplos estan orientados a bases de datos y mas me enrollo jejej.

Código (vbnet) [Seleccionar]
Public Class Form1

    ' eliminar registros iguales en  " Lnumbers "
    ' eliminar registros MENORES a MAX
    ' En este codigo deberia quedar un solo registro de los cuatro

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dim col1 As IEnumerable(Of Integer) = {1, 5, 6, 7, 8, 9, 10, 11}
        Dim col2 As IEnumerable(Of Integer) = {1, 5, 6, 7, 8, 9, 10, 11}
        Dim col3 As IEnumerable(Of Integer) = {1, 2, 8, 6, 9}
        Dim col4 As IEnumerable(Of Integer) = {2, 2, 3}
        Dim MAX As Integer = 10


        Dim Lnumbers As List(Of IEnumerable(Of Integer)) = {col1, col2, col3, col4}.ToList


        For Each col As IEnumerable(Of Integer) In Lnumbers



            ListBox1.Items.Add(String.Join(", ", From value As Integer In col
                                                                      Select If(value.ToString.Length = 1I,
                                                                                value.ToString.Insert(0I, "0"c),
                                                                                value.ToString)))


        Next col

        '***********************aca me tranco

        Dim concatCol As IEnumerable(Of Integer) = Lnumbers
        Dim distinctCol As IEnumerable(Of Integer) = concatCol
        Dim selectCol As IEnumerable(Of Integer) = distinctCol.Select(Function(value As Integer)
                                                                          If value = MAX Then
                                                                              Return value
                                                                          Else

                                                                              Return value
                                                                          End If

                                                                      End Function)


        ListBox2.Items.AddRange(selectCol.Cast(Of Object).ToArray)

    End Sub

End Class

Que tu sabiduria no sea motivo de Humillacion para los demas

luis456

AAAAAAAAAAAAAAAAAA

TAMPOCO


Código (vbnet) [Seleccionar]
Dim products = Lnumbers

        Dim cat = From value In products _
                            Select value _
                            Distinct

        For Each n In cat

            ListBox2.Items.Add(String.Join(", ", From value As Integer In n
                                                                      Select If(value.ToString.Length = 1I,
                                                                                value.ToString.Insert(0I, "0"c),
                                                                                value.ToString)))
        Next

Que tu sabiduria no sea motivo de Humillacion para los demas

luis456

Bueno consegui solucionar uno de los problemas :) y es eliminar del listbox los repetidos pero los completos o sea los que tienen 10 registros  ;( alguien se anima a mejorarlo para que no me queden a si

02 03 05
01 02 03 04 05
02 05 06 07 0 9

y me deje solo los registros completos  ?


Código (vbnet) [Seleccionar]
Public Class Form1

    ' eliminar registros iguales en  " Lnumbers " lo solucione quitandolos del listxbo
    ' eliminar registros MENORES a MAX
    ' En este codigo deberia quedar un solo registro de los cuatro

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dim col1 As IEnumerable(Of Integer) = {1, 5, 6, 7, 8, 9, 10, 11}
        Dim col2 As IEnumerable(Of Integer) = {1, 5, 6, 7, 8, 9, 10, 11}
        Dim col3 As IEnumerable(Of Integer) = {1, 2, 8, 6, 9}
        Dim col4 As IEnumerable(Of Integer) = {2, 2, 3}
        Dim MAX As Integer = 10


        Dim Lnumbers As List(Of IEnumerable(Of Integer)) = {col1, col2, col3, col4}.ToList


        For Each col As IEnumerable(Of Integer) In Lnumbers

            ListBox1.Items.Add(String.Join(", ", From value As Integer In col
                                                                      Select If(value.ToString.Length = 1I,
                                                                                value.ToString.Insert(0I, "0"c),
                                                                                value.ToString)))

        Next col
    End Sub


    '*****************************************preubas**********
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        ' Le pasa el Listbox a la función
        MsgBox(Eliminar(ListBox1), _
               MsgBoxStyle.Information, _
               "Elementos duplicados en el List ")
    End Sub
    Function Eliminar(ByVal LB As ListBox) As Int32
        Dim i As Int32
        Dim j As Int32
        Dim n As Int32

        ' Recorre los items ( copara empezando _
        'desde el primero , de abajo hacia arriba)
        For i = 0 To LB.Items.Count - 2
            For j = LB.Items.Count - 1 To i + 1 Step -1
                ' verifica si es el mismo
                If LB.Items(i).ToString = LB.Items(j).ToString Then
                    ' elimina el elemento indicando el índice
                    LB.Items.RemoveAt(j)
                    n += 1 'lleva la cuenta de los duplicados
                End If
            Next
        Next
        Return n ' retorna los eliminados
    End Function
End Class


los ejemplos  (los 100)  ;)  no me aclaran nada

Luis
Que tu sabiduria no sea motivo de Humillacion para los demas

Eleкtro

#8
Especifica claramente lo de los duplicados, dices que en este ejemplo solo debe quedar una secuencia (o eso entiendo por "registro"), ¿cual?, y ¿por qué?.

Citar
Código (vbnet) [Seleccionar]
Dim col1 As IEnumerable(Of Integer) = {1, 5, 6, 7, 8, 9, 10, 11}
Dim col2 As IEnumerable(Of Integer) = {1, 5, 6, 7, 8, 9, 10, 11}
Dim col3 As IEnumerable(Of Integer) = {1, 2, 8, 6, 9}
Dim col4 As IEnumerable(Of Integer) = {2, 2, 3}

¿Quieres dscartar los valores duplicados entre cada decuencia?, ¿o quieres descartar la secuencia entera en caso de que algún valor esté repetido con los valores de otra de las secuencias?, por que ambas cosas son muy distintas.

Da más detalles

Saludos








luis456

Cita de: Eleкtro en 30 Abril 2015, 20:39 PM
Especifica claramente lo de los duplicados, dices que en este ejemplo solo debe quedar una secuencia (o eso entiendo por "registro"), ¿cual?, y ¿por qué?.

¿Quieres dscartar los valores duplicados entre cada decuencia?, ¿o quieres descartar la secuencia entera en caso de que algún valor esté repetido con los valores de otra de las secuencias?, por que ambas cosas son muy distintas.

Da más detalles

Saludos


eliminar de la lista los resultados como te muestro


01, 03, 04, 05, 06, 08<----X
01, 03, 04, 05, 06, 08 <----repite con el anterior
01, 03, 04, 05, 09, 30
01, 03, 04, 05, 30, 30 <----X
01, 03, 04, 05, 30, 40 <----repite con el anterior
01, 03, 04, 05, 30, 40 <----repite con el anterior
01, 03, 04, 06, 07 <--------no llega a la cantidad
01, 03, 04,<----------------no llega a la cantidad 
01, 03, 04, 06, 08, 09
01, 03, 04, 06, 08, 27
01, 03, 04, 06, 08, 49
01, 03, 04, 06, 12<--------no llega a la cantidad

es eliminar los que sean iguales claro esta dejando uno solo de los que repiten :)
y los que no llegan a tener la cantida establecida eliminarlos.

aca van dos numeros estos si eliminar ya que son iguales en todo Y dejar un solo registro

01, 03, 04, 05, 30, 40 <----
01, 03, 04, 05, 30, 40 <----repite con el anterior


estos dejar ya que son diferentes aunque sea un solo numero

01, 03, 04, 05, 30, 40
01, 03, 04, 05, 30, 80

eliminar repetidos y que no cumplan la cantida establecida que seria MAX=10






Que tu sabiduria no sea motivo de Humillacion para los demas