Foro de elhacker.net

Programación => .NET (C#, VB.NET, ASP) => Mensaje iniciado por: Usuario 202 en 8 Junio 2016, 19:54 pm



Título: Ordenar valores de menor a mayor en una LisBox
Publicado por: Usuario 202 en 8 Junio 2016, 19:54 pm
Hola, estoy trabajando en un pequeño proyecto en Visual studio, en Form y me he encontrado con un problema.

Mi problema es como ordenar los valores agregados a una ListBox por medio de un botón. Me dieron un código que es de las propiedades de la ListBox, estoy hablando del "Sorted". Bueno este es el código que tengo.

Código
  1. Public Class Form1
  2.  
  3.    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
  4. ' Esto es para agregar los valores a la ListBox
  5.        ListBox1.Items.Add(TextBox1.Text)
  6.        TextBox1.Text = ""
  7.        TextBox1.Focus()
  8.    End Sub
  9.  
  10.    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
  11. ' Esto segun es para que se ordenara
  12.        ListBox1.Sorted = True
  13.    End Sub
  14. End Class

Y cuando lo ejecuto ocurre esto:

(https://k61.kn3.net/2/B/7/5/0/3/0AA.png)

Si saben como arreglar o que otro código implementar para que se pueda ordenar de menor a mayor se los agradeceré.


Título: Re: Ordenar valores de menor a mayor en una LisBox
Publicado por: Eleкtro en 15 Junio 2016, 01:11 am
En realidad no hay ningún error, estás describiendo el comportamiento normal del algoritmo de ordenamiento de texto, donde "2" es mayor que "1000".

El problema real es que estás añadiendo elementos de tipo String en el ListBox. Si añadieses elementos de tipo Integer, entonces la propiedad ListBox.Sorted cumpliría su cometido dando el resultado que esperas obtener, un ordenamiento numérico.

La solución más directa ya la he mencionado, pero de todas formas una solución simple al problema actual sería la siguiente:
Código
  1. Dim integerSet As New SortedSet(Of Integer)
  2. For Each item As Object In Me.ListBox1.Items
  3.    integerSet.Add(CInt(item))
  4. Next item
  5.  
  6. ' Me.ListBox1.SuspendLayout()
  7. Me.ListBox1.Items.Clear()
  8. For Each value As Integer In integerSet
  9.    Me.ListBox1.Items.Add(value)
  10. Next value
  11. ' Me.ListBox1.ResumeLayout()

Nota: También puedes utilizar el tipo List para añadir los elementos numéricos de forma desordenada, y activar la propiedad ListBox.Sorted, el resultado será el mismo.

Saludos.


Título: Re: Ordenar valores de menor a mayor en una LisBox
Publicado por: Usuario 202 en 16 Junio 2016, 04:25 am
Elrtro gracias por responder.

Tu respuesta me libro de un problema pero surgió otro problema.

Entendí lo de String y Integer, en la ListBox, pero no pude implementar tu código ya que me daba un error en As New SortedSet(Of Integer) ya que el tipo 'SortedSet' no está definido. Bueno la verdad no supe en donde poner el código.

Si me explicaras mejor en donde poner el código te lo agradecere


Título: Re: Ordenar valores de menor a mayor en una LisBox
Publicado por: Eleкtro en 16 Junio 2016, 05:13 am
Según la MSDN, el tipo System.Collections.Generic.SortedSet(Of T) está disponible a partir de .NET Framework v4.0.
  • https://msdn.microsoft.com/en-us/library/dd412070%28v=vs.110%29.aspx

Puedes cambiar la versión de .NET Framework en las opciones del proyecto de Visual Studio. Si por el motivo que sea no puedes trabajar bajo .NET Framework v4.0, entonces como ya te mencioné puedes utilizar el tipo genérico System.Collections.Generic.List(Of T):

Código
  1.    Dim integerList As New List(Of Integer)
  2.    For Each item As Object In Me.ListBox1.Items
  3.        integerList.Add(CInt(item))
  4.    Next item
  5.    integerList.Sort(Comparer(Of Integer).Default)
  6.  
  7.    For Each value As Integer In integerList
  8.        Me.ListBox1.Items.Add(value)
  9.    Next value



Bueno la verdad no supe en donde poner el código.

Te lo voy a poner bien facil.

1. Añade este módulo a tu código fuente:

Código
  1. <HideModuleName>
  2. Public Module ListBoxExtensions
  3.  
  4.    <DebuggerStepThrough>
  5.    <Extension>
  6.    Public Sub Sort(Of T)(ByVal sender As ListBox)
  7.        ListBoxExtensions.Sort(Of T)(sender, Comparer(Of T).Default)
  8.    End Sub
  9.  
  10.    <DebuggerStepThrough>
  11.    <Extension>
  12.    Public Sub Sort(Of T)(ByVal sender As ListBox, ByVal comparer As IComparer(Of T))
  13.  
  14.        Dim itemList As New List(Of T)
  15.        For Each item As T In sender.Items
  16.            itemList.Add(item)
  17.        Next item
  18.        itemList.Sort(comparer)
  19.  
  20.        sender.SuspendLayout()
  21.        sender.Items.Clear()
  22.        For Each item As T In itemList
  23.            sender.Items.Add(item)
  24.        Next item
  25.        sender.ResumeLayout()
  26.  
  27.    End Sub
  28.  
  29. End Module

2. Cuando quieras ordenar los elementos del ListBox, simplemente debes llamar al método Sort:
Código
  1. Me.ListBox1.Sort(Of Integer) ' Para enteros.

...O si necesitas un ordenamiento de Strings:
Código
  1. Me.ListBox1.Sort(Of String) ' Para texto.

PD: Lo siento, sin querer reemplacé el contenido de tu último mensaje, lo he podido recuperar pero se perdió el formato que le diste.

Saludos


Título: Re: Ordenar valores de menor a mayor en una LisBox
Publicado por: Usuario 202 en 16 Junio 2016, 22:35 pm
Te agradezco mucho por ayudarme Eleкtro, ya pude hacerlo.

Aunque debo de confesar, que en lo del modulo me confundí.

Pero al final pude hacerlo, estaba trabajando en el Visual Studio 2008 y las plantillas solo estaban asta la NET Framework v3.0, así que mude mi proyecto al Visual Studio 2013, y utilice este código.


Código
  1.    Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
  2. ' Este codigo esta dentro del boton de "Ordenar"
  3.        Dim integerSet As New SortedSet(Of Integer)
  4.        For Each item As Object In Me.ListBox1.Items
  5.            integerSet.Add(CInt(item))
  6.        Next item
  7.  
  8.        Me.ListBox1.Items.Clear()
  9.        For Each value As Integer In integerSet
  10.            Me.ListBox1.Items.Add(value)
  11.        Next value
  12.    End Sub

Y este es el resultado:

(https://k60.kn3.net/2/F/8/7/D/0/BEB.jpg)

Si tengo otra duda con mi proyecto espero contar con tu ayuda para poder resolverla.

PD: Aunque este tema ya esta resuelto, la verdad me gustaría que me explicaras mejor lo del modulo ya que no entendí muy bien, pero a fin de cuentas gracias por ayudarme.


Título: Re: Ordenar valores de menor a mayor en una LisBox
Publicado por: Eleкtro en 16 Junio 2016, 23:42 pm
PD: Aunque este tema ya esta resuelto, la verdad me gustaría que me explicaras mejor lo del modulo ya que no entendí muy bien, pero a fin de cuentas gracias por ayudarme.[/b][/size]

En VB.NET, a diferencia de C#, puedes usar una Class:
Código
  1. Public Class MiClase
  2. ' ...
  3. End Class

O tmabién un Module:
Código
  1. Public Module MiModulo
  2. ' ...
  3. End Module

Al igual que se haría para añadir una class, debes crear un nuevo archivo con extensión '.vb' y añadir el código del module. En Visual Studio, en el explorador de la solución, puedes añadir una class o un module de forma guiada con el botón derecho del ratón.

Los módulos se suelen utilizar para declarar métodos de extensión, que sirven para ampliar o extender los métodos que puedes utilizar para "X" type, por ejemplo: en el módulo que te mostré, podemos acceder al método "Sort" escribiendo el nombre del método desde cualquier instancia de un Listbox: Listbox1.Sort() , pero también podemos usar el método escribiendo el nombre completo: MiModulo.Sort(Listbox1) .

Saludos