elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: ¿Eres nuevo? ¿Tienes dudas acerca del funcionamiento de la comunidad? Lee las Reglas Generales


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (C#, VB.NET, ASP) (Moderador: kub0x)
| | | |-+  Seguimos con registros en listbox :)
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Seguimos con registros en listbox :)  (Leído 4,285 veces)
luis456


Desconectado Desconectado

Mensajes: 551



Ver Perfil
Seguimos con registros en listbox :)
« en: 28 Marzo 2016, 17:24 pm »

Sigo con mis eternos rollos de los listbox  :silbar: ,ya resuelto el problema de los iguales ahora tengo otra incógnita

si tengo un listbox con estos registros


1 2 3 *********correlativos
1 4 5
1 3 4
1 3 5
2 3 4*********correlativo
4 5 6 ********correlativo
6 7 8 ********correlativo

Y quiero eliminar los números correlativos como lo puedo hacer ya he visto 100 ejemplos de linq jejje pero solo son para bases de datos

luis






« Última modificación: 29 Marzo 2016, 10:38 am por luis456 » En línea

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

Desconectado Desconectado

Mensajes: 268



Ver Perfil
Re: Seguimos con registros en listbox :)
« Respuesta #1 en: 28 Marzo 2016, 22:07 pm »

Código
  1.  
  2.        ListBox1.Items.Add("1 2 3")
  3.        ListBox1.Items.Add("1 4 5")
  4.        ListBox1.Items.Add("1 3 4")
  5.        ListBox1.Items.Add("1 3 5")
  6.        ListBox1.Items.Add("2 3 4")
  7.        ListBox1.Items.Add("4 5 6")
  8.        ListBox1.Items.Add("6 7 8")
  9.  
  10.        '//Elimina combinaciones correlativas
  11.        Dim ClearList As New List(Of String)
  12.        ClearList.AddRange(ListBox1.Items.OfType(Of String))
  13.        For Each Digito As String In ClearList
  14.            If CDbl(Digito.Substring(2, 1)) = CDbl(Digito.Substring(0, 1)) + 1 And
  15.                 CDbl(Digito.Substring(4, 1)) = CDbl(Digito.Substring(2, 1)) + 1 Then
  16.                ListBox1.Items.Remove(Digito)
  17.            End If
  18.        Next
  19.  
  20.  

Devuelve:
Código:
1 4 5
1 3 4
1 3 5

Simplemente hace una comparación de dígitos línea por línea:

Linea -->  a b c

si b= a+1 y c = b+1 entonces borra la línea

A la hora de usar  Substring, hay que tener en cuenta el lugar de los dígitos:

0]A[1]espacio[2]B[3]espacio[4]C
 
A está en la posición 0 --> (0, 1)
B está en la posición 2 --> (2, 1)
C está en la posición 4 --> (4, 1)






« Última modificación: 29 Marzo 2016, 01:32 am por Lekim » En línea

luis456


Desconectado Desconectado

Mensajes: 551



Ver Perfil
Re: Seguimos con registros en listbox :)
« Respuesta #2 en: 29 Marzo 2016, 02:57 am »

Gracias Lekim  " PERO "  :silbar: :silbar:

Probandolo me da error " La conversión de la cadena "," en el tipo 'Double' no es válida. "

Código
  1. If CDbl(Digito.Substring(2, 1)) = CDbl(Digito.Substring(0, 1)) + 1 And
  2.                 CDbl(Digito.Substring(4, 1)) = CDbl(Digito.Substring(2, 1)) + 1 Then


"

Luis
En línea

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

Desconectado Desconectado

Mensajes: 268



Ver Perfil
Re: Seguimos con registros en listbox :)
« Respuesta #3 en: 29 Marzo 2016, 03:04 am »

Amos a ver  ::)

Esa es la razón de que me haya molestado en explicar esto:

Código:
Simplemente hace una comparación de dígitos línea por línea:

Linea -->  a b c

si b= a+1 y c = b+1 entonces borra la línea

A la hora de usar  Substring, hay que tener en cuenta el lugar de los dígitos:

0]A[1]espacio[2]B[3]espacio[4]C
 
A está en la posición 0 --> (0, 1)
B está en la posición 2 --> (2, 1)
C está en la posición 4 --> (4, 1)


Si tu lo tienes puesto en el ListBox así ("1 ,2 ,3")

La posición de los dígitos cambia. Como yo no soy adivino y no se como lo tienes pues te he puesto el ejemplo en base a como lo has mostrado tu;

Código:
1 2 3 *********correlativos
1 4 5
1 3 4
1 3 5
2 3 4*********correlativo
4 5 6 ********correlativo
6 7 8 ********correlativo

¿Verdad que no lo has puesto así? 1 ,4 ,5. Pues eso.

Si copias mi código tal cual en un nuevo form y con un único listbox y lo pones en el evento load te funciona.  Lo que pasa es que como he dicho tu lo dentrás así con las comas.

Código:
1 ,2 ,3




A ver así  ::)

Código
  1.        ListBox1.Items.Add("1, 2, 3")
  2.        ListBox1.Items.Add("1, 4, 5")
  3.        ListBox1.Items.Add("1, 3, 4")
  4.        ListBox1.Items.Add("1, 3, 5")
  5.        ListBox1.Items.Add("2, 3, 4")
  6.        ListBox1.Items.Add("4, 5, 6")
  7.        ListBox1.Items.Add("6, 7, 8")
  8.  
  9.        '//Elimina combinaciones correlativas
  10.        Dim ClearList As New List(Of String)
  11.        ClearList.AddRange(ListBox1.Items.OfType(Of String))
  12.        For Each Digito As String In ClearList
  13.            If CDbl(Digito.Substring(3, 1)) = CDbl(Digito.Substring(0, 1)) + 1 And
  14.                 CDbl(Digito.Substring(6, 1)) = CDbl(Digito.Substring(3, 1)) + 1 Then
  15.                ListBox1.Items.Remove(Digito)
  16.            End If
  17.        Next



0]A[1]espacio[2],[3]B[4]espacio[5],[6]C
 
A está en la posición 0 --> (0, 1)
B está en la posición 3 --> (3, 1)
C está en la posición 6 --> (6, 1)

Lo explicaré mejor:

Donde Dígito es una cadena tal como A ,B ,C

Digito.Substring(6, 1) devuelve UN  carácter que se encuentra en la posición SEIS empezando desde la izquierda. O sea que si mueves el cursor 6 veces se pondrá justo delante de C en este caso [A ,B ,C] y devuelve justo ese carácter.

S2s


A ver que me he hecho un lío con las comas XD, pero funcionaba igual jeje

Código
  1.        ListBox1.Items.Add("1 ,2 ,3")
  2.        ListBox1.Items.Add("1 ,4 ,5")
  3.        ListBox1.Items.Add("1 ,3 ,4")
  4.        ListBox1.Items.Add("1 ,3 ,5")
  5.        ListBox1.Items.Add("2 ,3 ,4")
  6.        ListBox1.Items.Add("4 ,5 ,6")
  7.        ListBox1.Items.Add("6 ,7 ,8")
  8.  
  9.        '//Elimina combinaciones correlativas
  10.        Dim ClearList As New List(Of String)
  11.        ClearList.AddRange(ListBox1.Items.OfType(Of String))
  12.        For Each Digito As String In ClearList
  13.            If CDbl(Digito.Substring(3, 1)) = CDbl(Digito.Substring(0, 1)) + 1 And
  14.                 CDbl(Digito.Substring(6, 1)) = CDbl(Digito.Substring(3, 1)) + 1 Then
  15.                ListBox1.Items.Remove(Digito)
  16.            End If
  17.        Next
« Última modificación: 29 Marzo 2016, 03:24 am por Lekim » En línea

Lekim

Desconectado Desconectado

Mensajes: 268



Ver Perfil
Re: Seguimos con registros en listbox :)
« Respuesta #4 en: 29 Marzo 2016, 03:31 am »

También valdría CInt, creo que mejor incluso ya que son números pequeños:

Código
  1.   ListBox1.Items.Add("1 ,2 ,3")
  2.        ListBox1.Items.Add("1 ,4 ,5")
  3.        ListBox1.Items.Add("1 ,3 ,4")
  4.        ListBox1.Items.Add("1 ,3 ,5")
  5.        ListBox1.Items.Add("2 ,3 ,4")
  6.        ListBox1.Items.Add("4 ,5 ,6")
  7.        ListBox1.Items.Add("6 ,7 ,8")
  8.  
  9.        '//Elimina combinaciones correlativas
  10.        Dim ClearList As New List(Of String)
  11.        ClearList.AddRange(ListBox1.Items.OfType(Of String))
  12.        For Each Digito As String In ClearList
  13.            If CInt(Digito.Substring(3, 1)) = CInt(Digito.Substring(0, 1)) + 1 And
  14.                 CInt(Digito.Substring(6, 1)) = CInt(Digito.Substring(3, 1)) + 1 Then
  15.                ListBox1.Items.Remove(Digito)
  16.            End If
  17.        Next
En línea

luis456


Desconectado Desconectado

Mensajes: 551



Ver Perfil
Re: Seguimos con registros en listbox :)
« Respuesta #5 en: 29 Marzo 2016, 03:35 am »

También valdría CInt, creo que mejor incluso ya que son números pequeños:

Código
  1.   ListBox1.Items.Add("1 ,2 ,3")
  2.        ListBox1.Items.Add("1 ,4 ,5")
  3.        ListBox1.Items.Add("1 ,3 ,4")
  4.        ListBox1.Items.Add("1 ,3 ,5")
  5.        ListBox1.Items.Add("2 ,3 ,4")
  6.        ListBox1.Items.Add("4 ,5 ,6")
  7.        ListBox1.Items.Add("6 ,7 ,8")
  8.  
  9.        '//Elimina combinaciones correlativas
  10.        Dim ClearList As New List(Of String)
  11.        ClearList.AddRange(ListBox1.Items.OfType(Of String))
  12.        For Each Digito As String In ClearList
  13.            If CInt(Digito.Substring(3, 1)) = CInt(Digito.Substring(0, 1)) + 1 And
  14.                 CInt(Digito.Substring(6, 1)) = CInt(Digito.Substring(3, 1)) + 1 Then
  15.                ListBox1.Items.Remove(Digito)
  16.            End If
  17.        Next

Vale ya son las tres y media jejje + algo de vino no veo ni la pantalla mañana lo revizo jejej a dormir

AAA y gracias

Luis



En línea

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

Desconectado Desconectado

Mensajes: 268



Ver Perfil
Re: Seguimos con registros en listbox :)
« Respuesta #6 en: 29 Marzo 2016, 03:39 am »

Sería mejor que lo pusieras así 01, 25, 06, para no tener que hacer la distinción de se es un dígito o dos, porque si no te va a dar error cuando hayan dos dígitos ya que cambia las posiciones.


    
Código
  1.  
  2.        ListBox1.Items.Add("01 ,02 ,03")
  3.        ListBox1.Items.Add("03 ,04 ,05")
  4.        ListBox1.Items.Add("15 ,35 ,45")
  5.        ListBox1.Items.Add("15 ,35 ,55")
  6.        ListBox1.Items.Add("25 ,35 ,45")
  7.        ListBox1.Items.Add("45 ,55 ,65")
  8.        ListBox1.Items.Add("57 ,58 ,59")
  9.  
  10.        '//Elimina combinaciones correlativas
  11.         Dim ClearList As New List(Of String)(ListBox1.Items.OfType(Of String))
  12.  
  13.        For Each Digito As String In ClearList
  14.            If CInt(Digito.Substring(4, 2)) = CInt(Digito.Substring(0, 2)) + 1 And
  15.                 CInt(Digito.Substring(8, 2)) = CInt(Digito.Substring(4, 2)) + 1 Then
  16.                ListBox1.Items.Remove(Digito)
  17.            End If
  18.        Next



Para ser más precisos se podría usar Regex, pero si fijo vas a usar dos dígitos, y pones los números del uno al 10 así, 01, 02, 03 .. no hace falta.



Otra forma sería como he comentado con Regex. En este caso no importa si el número tiene uno, dos, tres, etc, dígitos. Pero es importante establecer qué carácter o cadena habrá entre ellos en Pattern.


Código
  1.  
  2.       ListBox1.Items.Add("1 ,2 ,3") '<-Se borrará
  3.        ListBox1.Items.Add("3 ,4 ,5") '<-Se borrará
  4.        ListBox1.Items.Add("3 ,24 ,18")
  5.        ListBox1.Items.Add("15 ,35 ,45")
  6.        ListBox1.Items.Add("16 ,17 ,18") '<-Se borrará
  7.        ListBox1.Items.Add("45 ,55 ,65")
  8.        ListBox1.Items.Add("57 ,58 ,59") '<-Se borrará
  9.        ListBox1.Items.Add("346 ,348 ,350")
  10.        ListBox1.Items.Add("350 ,351 ,352") '<-Se borrará
  11.  
  12.        Dim Pattern As String = " ,"
  13.        Dim Digito() As String
  14.  
  15.        '//Elimina combinaciones correlativas
  16.       Dim ClearList As New List(Of String)(ListBox1.Items.OfType(Of String))
  17.  
  18.        For Each Item As String In ClearList
  19.            Digito = System.Text.RegularExpressions.Regex.Split(Item, Pattern)
  20.            If CInt(Digito(1)) = CInt(Digito(0)) + 1 And
  21.            CInt(Digito(2)) = CInt(Digito(1)) + 1 Then
  22.                ListBox1.Items.Remove(Item)
  23.            End If
  24.        Next
  25.  
  26.        '//Lo que hace Regex.Split es devolver los valores que están entre espacio y coma  --> " ,"
  27.        '//Si hay tres números las posiciones serían:
  28.        '//0[ ,]1[ ,]2
  29.        '//Digito(0) devuelve el primer número
  30.        '//Digito(1) devuelve el segundo número
  31.        '//Digito(2) devuelve el tercer número
  32.  

Devuelve:

Código:
3 ,24 ,18
15 ,35 ,45
45 ,55 ,65
346 ,348 ,350
« Última modificación: 29 Marzo 2016, 14:10 pm por Lekim » En línea

luis456


Desconectado Desconectado

Mensajes: 551



Ver Perfil
Re: Seguimos con registros en listbox :)
« Respuesta #7 en: 29 Marzo 2016, 10:37 am »

perfecto con este  ;-) ;-) ;-)

Código
  1. ListBox1.Items.Add("01 ,02 ,03")
  2.        ListBox1.Items.Add("03 ,04 ,05")
  3.        ListBox1.Items.Add("15 ,35 ,45")
  4.        ListBox1.Items.Add("15 ,35 ,55")
  5.        ListBox1.Items.Add("25 ,35 ,45")
  6.        ListBox1.Items.Add("45 ,55 ,65")
  7.        ListBox1.Items.Add("57, 58 ,59")
  8.  
  9.        '//Elimina combinaciones correlativas
  10.         Dim ClearList As New List(Of String)(ListBox1.Items.OfType(Of String))
  11.  
  12.        For Each Digito As String In ClearList
  13.            If CInt(Digito.Substring(4, 2)) = CInt(Digito.Substring(0, 2)) + 1 And
  14.                 CInt(Digito.Substring(8, 2)) = CInt(Digito.Substring(4, 2)) + 1 Then
  15.                ListBox1.Items.Remove(Digito)
  16.            End If
  17.        Next  


Luis
En línea

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

Desconectado Desconectado

Mensajes: 268



Ver Perfil
Re: Seguimos con registros en listbox :)
« Respuesta #8 en: 29 Marzo 2016, 14:23 pm »

Pero...

Como te he comentado también puedes usar REGEX, fíjate que el código parece el mismo pero no es igual. El uno usa Substring y el otro Regex.

Con regex da igual si lo pones así: 1 2 3 o así 1 ,2 ,3 o así  01, 02, 03 sólo tienes que establecer qué carácter o cadena hay entre los números en Pattern.

REGEX
Código
  1.  
  2.        ListBox1.Items.Add("01 ,02 ,03")
  3.        ListBox1.Items.Add("3 ,4 ,5")
  4.        ListBox1.Items.Add("15 ,35 ,45")
  5.        ListBox1.Items.Add("15 ,35 ,55")
  6.        ListBox1.Items.Add("25 ,35 ,45")
  7.        ListBox1.Items.Add("45 ,55 ,65")
  8.        ListBox1.Items.Add("57 ,58 ,59")
  9.  
  10.        Dim Pattern As String = " ,"
  11.        Dim Digito() As String
  12.  
  13.        Dim ClearList As New List(Of String)(ListBox1.Items.OfType(Of String))
  14.  
  15.        For Each Item As String In ClearList
  16.            Digito = System.Text.RegularExpressions.Regex.Split(Item, Pattern)
  17.            If CInt(Digito(1)) = CInt(Digito(0)) + 1 And
  18.               CInt(Digito(2)) = CInt(Digito(1)) + 1 Then
  19.                ListBox1.Items.Remove(Item)
  20.            End If
  21.        Next
Fíjate que hay una línea en la que la he puesto sin el cero delante, y no da error:

Código:
 ListBox1.Items.Add("3 ,4 ,5")

OTRAS CONDICIONES
Puedes cambiar las condiciones fácilmente.


Este código borra las combinaciones cuyo tercer número tiene dos valores mayor que el segundo.
Por ejemplo:

1 ,2 ,4
2, 3, 5

Código
  1.  
  2.        ListBox1.Items.Add("01 ,02 ,03")
  3.        ListBox1.Items.Add("3 ,4 ,5")
  4.        ListBox1.Items.Add("15 ,35 ,45")
  5.        ListBox1.Items.Add("15 ,35 ,55")
  6.        ListBox1.Items.Add("25 ,35 ,37")
  7.        ListBox1.Items.Add("45 ,55 ,57")
  8.        ListBox1.Items.Add("57 ,58 ,60")
  9.  
  10.        Dim Pattern As String = " ,"
  11.        Dim Digito() As String
  12.  
  13.        Dim ClearList As New List(Of String)(ListBox1.Items.OfType(Of String))
  14.  
  15.        For Each Item As String In ClearList
  16.            Digito = System.Text.RegularExpressions.Regex.Split(Item, Pattern)
  17.            If CInt(Digito(2)) = CInt(Digito(1)) + 2 Then
  18.                ListBox1.Items.Remove(Item)
  19.            End If
  20.        Next
  21.  


Este otro combina las condiciones anteriores, borra las líneas que tengan números correlativos y además las que tengan el tercer número dos veces mayor que el segundo.


Código
  1.        ListBox1.Items.Add("01 ,02 ,03")
  2.        ListBox1.Items.Add("3 ,4 ,5")
  3.        ListBox1.Items.Add("15 ,35 ,45")
  4.        ListBox1.Items.Add("15 ,35 ,55")
  5.        ListBox1.Items.Add("25 ,35 ,37")
  6.        ListBox1.Items.Add("45 ,55 ,57")
  7.        ListBox1.Items.Add("57 ,58 ,60")
  8.  
  9.        Dim Pattern As String = " ,"
  10.        Dim Digito() As String
  11.  
  12.        Dim ClearList As New List(Of String)(ListBox1.Items.OfType(Of String))
  13.  
  14.        For Each Item As String In ClearList
  15.            Digito = System.Text.RegularExpressions.Regex.Split(Item, Pattern)
  16.            If CInt(Digito(2)) = CInt(Digito(1)) + 2 Or
  17.                CInt(Digito(1)) = CInt(Digito(0)) + 1 And
  18.               CInt(Digito(2)) = CInt(Digito(1)) + 1 Then
  19.                ListBox1.Items.Remove(Item)
  20.            End If
  21.        Next


Espero te sirva.
« Última modificación: 29 Marzo 2016, 14:42 pm por Lekim » En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines