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

 

 


Tema destacado: Trabajando con las ramas de git (tercera parte)


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


Desconectado Desconectado

Mensajes: 548



Ver Perfil
Ordenar listbox ??
« en: 25 Marzo 2016, 15:29 pm »

Tengo un listbox que tiene registros de esta forma

20, 24, 34
20, 24, 44
20, 24, 45
20, 34, 24
20, 34, 44
20, 45 ,24

necesito ordenarlos para saber cuantas lineas son iguales y haci poder eliminar duplicados explico:

si ordenamos los números de arriba estos quedarían así

ordenados vemos que se repiten
20, 24, 34
20, 24, 44
20, 24, 45****
20, 24, 34****
20, 34 ,45
20, 24, 45 ***

tengo este  código pero lo ordena de menor a mayor


Código
  1. Private Sub Button12_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button12.Click
  2.        ListBox1.Sorted = True
  3.        ListBox1.Sorted = False
  4.        Dim i As Integer
  5.        Dim count = ListBox1.Items.Count
  6.        For i = ListBox1.Items.Count - 1 To 0 Step -1
  7.            ListBox1.Items.Add(ListBox1.Items(i))
  8.        Next
  9.        For i = 0 To count - 1
  10.            ListBox1.Items.RemoveAt(ListBox1.SelectedItem)
  11.        Next
  12.    End Sub

 alguna sugerencia o ejemplos que pueda conseguir

Luis









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

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

Desconectado Desconectado

Mensajes: 222



Ver Perfil
Re: Ordenar listbox ??
« Respuesta #1 en: 25 Marzo 2016, 17:47 pm »

Hola puedes revisar esta posible solucion

Código
  1. Public Class Form1
  2.    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
  3.        Dim list As New List(Of String)
  4.        Dim i As Integer
  5.  
  6.        For i = 0 To ListBox1.Items.Count - 1
  7.            list.Add(ListBox1.Items(i))
  8.        Next i
  9.  
  10.        ListBox1.Items.Clear()
  11.  
  12.        For Each s As String In list.Distinct
  13.            ListBox1.Items.Add(s)
  14.        Next
  15.  
  16.    End Sub
  17. End Class




En línea

Si C/C++ es el padre de los lenguajes entonces ASM es dios.
Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.818



Ver Perfil
Re: Ordenar listbox ??
« Respuesta #2 en: 25 Marzo 2016, 17:57 pm »

Lo estás haciendo todo al revés Luis, primero estás obteniendo una coleccion con sub-colecciones por elementos ( IEnumerable(Of IEnumerable(Of Integer)) ), luego, por cada sub-colección, unes todos los sub-elementos en un string con String.Join(), luego, ese string, el cual contiene la representación de cada sub-colección con saltos de linea, lo partes por un salto de linea ( colección.Split({Environment.NewLine}) ) para obtener de nuevo una colección que insertar en el listbox... y ahora, quieres volver a convertir los elementos del Listbox en un array de enteros para eliminar duplicados.

No se si me he equivocado en algún paso del procedimiento, por que ya solo de pensarlo es un completo lio lo que estás haciendo, tanta conversión de array a string, y viceversa, DEJA DE HACER ESO.

Si quieres eliminar duplicados, entonces hazlo en el momento en el que construyes la colección de combinaciones, NO despues de haberla transformado en no se cuantos tipos de objetos ya :¬¬.

Mi consejo:
Intenta hacer un buen planteamiento de la lógica antes de escribir ningún código, por que luego acabarás con necesidades como esta, me refiero a tener que hacer algo en un paso del proceso en el que ya deberias haberlo hecho... no se si me explico.
Create un Type que herede de una colección genérica, llamemoslo CombinationCollection, y úsalo parra almacenar las combinaciones.
Para representar los valores o combinaciones, en un string, podrías utilizar un proveedor de formato personalizado, es decir, una class que implemente la interface IFormatProvider y ICustomFormatter (el cual usarias como formato personalizado en el método  String.Format()). O simplemente suplantar el método ToString en tu type personalizado.

Es mucho trabajo, como para mostrarte ejemplos de todo, pero en MSDN los puedes encontrar.

Saludos!
« Última modificación: 25 Marzo 2016, 18:06 pm por Eleкtro » En línea

luis456


Desconectado Desconectado

Mensajes: 548



Ver Perfil
Re: Ordenar listbox ??
« Respuesta #3 en: 25 Marzo 2016, 18:10 pm »

Hola puedes revisar esta posible solucion

Código
  1. Public Class Form1
  2.    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
  3.        Dim list As New List(Of String)
  4.        Dim i As Integer
  5.  
  6.        For i = 0 To ListBox1.Items.Count - 1
  7.            list.Add(ListBox1.Items(i))
  8.        Next i
  9.  
  10.        ListBox1.Items.Clear()
  11.  
  12.        For Each s As String In list.Distinct
  13.            ListBox1.Items.Add(s)
  14.        Next
  15.  
  16.    End Sub
  17. End Class




Gracias por tu ayuda pero no me elimina ,primero hay que ordenarlos para poder eliminar todas las lineas iguales son muchos registros

saludos
Luis


En línea

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


Desconectado Desconectado

Mensajes: 548



Ver Perfil
Re: Ordenar listbox ??
« Respuesta #4 en: 25 Marzo 2016, 18:21 pm »

Lo estás haciendo todo al revés Luis, primero estás obteniendo una coleccion con sub-colecciones por elementos ( IEnumerable(Of IEnumerable(Of Integer)) ), luego, por cada sub-colección, unes todos los sub-elementos en un string con String.Join(), luego, ese string, el cual contiene la representación de cada sub-colección con saltos de linea, lo partes por un salto de linea ( colección.Split({Environment.NewLine}) ) para obtener de nuevo una colección que insertar en el listbox... y ahora, quieres volver a convertir los elementos del Listbox en un array de enteros para eliminar duplicados.

No se si me he equivocado en algún paso del procedimiento, por que ya solo de pensarlo es un completo lio lo que estás haciendo, tanta conversión de array a string, y viceversa, DEJA DE HACER ESO.

Si quieres eliminar duplicados, entonces hazlo en el momento en el que construyes la colección de combinaciones, NO despues de haberla transformado en no se cuantos tipos de objetos ya :¬¬.

Mi consejo:
Intenta hacer un buen planteamiento de la lógica antes de escribir ningún código, por que luego acabarás con necesidades como esta, me refiero a tener que hacer algo en un paso del proceso en el que ya deberias haberlo hecho... no se si me explico.
Create un Type que herede de una colección genérica, llamemoslo CombinationCollection, y úsalo parra almacenar las combinaciones.
Para representar los valores o combinaciones, en un string, podrías utilizar un proveedor de formato personalizado, es decir, una class que implemente la interface IFormatProvider y ICustomFormatter (el cual usarias como formato personalizado en el método  String.Format()). O simplemente suplantar el método ToString en tu type personalizado.

Es mucho trabajo, como para mostrarte ejemplos de todo, pero en MSDN los puedes encontrar.

Saludos!

Hola bueno Elektro sabes que me baso mucho en tus modelos jejej y por supuestos tus consejos ya que te has pasado con la ayuda que me has dado, pero ciertas cosas son chinas para mi jejje,me acostumbre a trabajar con un tipo de variable y me vuelvo un lio cuando se cambia de modo, por eso es que trato de llevar al terreno que conozco las cosas. lo que pasa es que no quiero tocar tu código, me gustaría resolverlo mas facil y para mi seria poder limpiar el listbox de los resultados duplicados  después que estén hechos, ya sabes que cada quien le tiene una idea especifica a cada cosa  :silbar: y me interesa que tu codigo quede de esa manera.ya que códigos de combinaciones y permutas hay miles jejeje pero no es lo que busco.

saludos
Luis

En línea

Que tu sabiduria no sea motivo de Humillacion para los demas
Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.818



Ver Perfil
Re: Ordenar listbox ??
« Respuesta #5 en: 25 Marzo 2016, 21:56 pm »

Bueno Luis... ya que necesitas ayuda con esos códigos que tienes mezclados a tu manera, que le vamos a hacer.

Teniendo un ListBox con los sigueintes items:
Citar
1, 2, 3
3, 2, 1
1, 3, 2
2, 1, 3
4, 5, 6
7, 8, 9



El supuesto resultado que creo que esperas obtener es el siguiente:
Citar
1, 2, 3
4, 5, 6
7, 8, 9



(Más te vale que sea así, por que no hay quien sea capaz de entender en que sentido son "iguales" :¬¬)

Pues, entonces, una forma sencillita de hacerlo seria implementando tu propio comparer para evaluar duplicados:
Código
  1.    Public NotInheritable Class CombinationComparer : Implements IEqualityComparer(Of String)
  2.  
  3.        Public Shadows Function Equals(ByVal x As String, ByVal y As String) As Boolean _
  4.        Implements IEqualityComparer(Of String).Equals
  5.  
  6.            ' (temporalmente) Ordeno de forma ascendente los números de una cadena de texto delimitada por comas;
  7.            '
  8.            ' e.g.:
  9.            ' Una cadena de texto como "3, 1, 2" (con, o sin espacios en blanco),
  10.            ' se transformaría en "1,2,3" (sin espacios en blanco).
  11.  
  12.            x = String.Join(",", From value As String In x.Split({","c, " "c}, StringSplitOptions.RemoveEmptyEntries)
  13.                                 Order By value Ascending)
  14.  
  15.            y = String.Join(",", From value As String In y.Split({","c, " "c}, StringSplitOptions.RemoveEmptyEntries)
  16.                                 Order By value Ascending)
  17.  
  18.            #If DEBUG Then
  19.                        Console.WriteLine(String.Format("x:{0}", x))
  20.                        Console.WriteLine(String.Format("y:{0}", y))
  21.                        Console.WriteLine()
  22.            #End If
  23.  
  24.            Return (x = y)
  25.  
  26.        End Function
  27.  
  28.        Public Shadows Function GetHashCode(ByVal obj As String) As Integer _
  29.        Implements IEqualityComparer(Of String).GetHashCode
  30.  
  31.            Return MyBase.GetHashCode()
  32.  
  33.        End Function
  34.  
  35.    End Class

Y lo emplearías de la siguiente manera:
Código
  1. Dim items As String() = Me.ListBox1.Items.Cast(Of String)().ToArray()
  2. items = items.Distinct(New CombinationComparer).ToArray()
  3.  
  4. With Me.ListBox1
  5.    .SuspendLayout()
  6.    .Items.Clear()
  7.    .Items.AddRange(items)
  8.    .ResumeLayout()
  9. End With
  10.  
( importante: no olvides de usar la extensión ".ToArray()" como en el ejemplo, para crear una copia de la colección de items del ListBox )

PD:
Si no es ese el resultado que esperas obtener, no te preocupes, te lo he puesto bien facilito al menos el 50% de la tarea, solo tienes que cojer el comparer de ejemplo y realizar las adaptaciones necesarias en la implementación del métobo base IEqualityComparer(Of String).Equals, en la variable "X" e "Y".

Saludos
« Última modificación: 26 Marzo 2016, 00:45 am por Eleкtro » En línea

luis456


Desconectado Desconectado

Mensajes: 548



Ver Perfil
Re: Ordenar listbox ??
« Respuesta #6 en: 26 Marzo 2016, 10:32 am »

Bueno Luis... ya que necesitas ayuda con esos códigos que tienes mezclados a tu manera, que le vamos a hacer.

Teniendo un ListBox con los sigueintes items:


El supuesto resultado que creo que esperas obtener es el siguiente:


(Más te vale que sea así, por que no hay quien sea capaz de entender en que sentido son "iguales" :¬¬)

Pues, entonces, una forma sencillita de hacerlo seria implementando tu propio comparer para evaluar duplicados:
Código
  1.    Public NotInheritable Class CombinationComparer : Implements IEqualityComparer(Of String)
  2.  
  3.        Public Shadows Function Equals(ByVal x As String, ByVal y As String) As Boolean _
  4.        Implements IEqualityComparer(Of String).Equals
  5.  
  6.            ' (temporalmente) Ordeno de forma ascendente los números de una cadena de texto delimitada por comas;
  7.            '
  8.            ' e.g.:
  9.            ' Una cadena de texto como "3, 1, 2" (con, o sin espacios en blanco),
  10.            ' se transformaría en "1,2,3" (sin espacios en blanco).
  11.  
  12.            x = String.Join(",", From value As String In x.Split({","c, " "c}, StringSplitOptions.RemoveEmptyEntries)
  13.                                 Order By value Ascending)
  14.  
  15.            y = String.Join(",", From value As String In y.Split({","c, " "c}, StringSplitOptions.RemoveEmptyEntries)
  16.                                 Order By value Ascending)
  17.  
  18.            #If DEBUG Then
  19.                        Console.WriteLine(String.Format("x:{0}", x))
  20.                        Console.WriteLine(String.Format("y:{0}", y))
  21.                        Console.WriteLine()
  22.            #End If
  23.  
  24.            Return (x = y)
  25.  
  26.        End Function
  27.  
  28.        Public Shadows Function GetHashCode(ByVal obj As String) As Integer _
  29.        Implements IEqualityComparer(Of String).GetHashCode
  30.  
  31.            Return MyBase.GetHashCode()
  32.  
  33.        End Function
  34.  
  35.    End Class

Y lo emplearías de la siguiente manera:
Código
  1. Dim items As String() = Me.ListBox1.Items.Cast(Of String)().ToArray()
  2. items = items.Distinct(New CombinationComparer).ToArray()
  3.  
  4. With Me.ListBox1
  5.    .SuspendLayout()
  6.    .Items.Clear()
  7.    .Items.AddRange(items)
  8.    .ResumeLayout()
  9. End With
  10.  
( importante: no olvides de usar la extensión ".ToArray()" como en el ejemplo, para crear una copia de la colección de items del ListBox )

PD:
Si no es ese el resultado que esperas obtener, no te preocupes, te lo he puesto bien facilito al menos el 50% de la tarea, solo tienes que cojer el comparer de ejemplo y realizar las adaptaciones necesarias en la implementación del métobo base IEqualityComparer(Of String).Equals, en la variable "X" e "Y".

Saludos

Gracias ya esta solucionado  ;-) ;-) ;-) ;-) ;-) ;-)

saludos
Luis



En línea

Que tu sabiduria no sea motivo de Humillacion para los demas
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

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