Mis malas combinaciones :(

Iniciado por luis456, 9 Agosto 2014, 15:07 PM

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

Eleкtro

#20
Cita de: luis456 en 26 Agosto 2014, 19:38 PMlo que busco es ordenar las combinaciones que se muestran en el listbox ordenados de menor a mayor

Con esto ordenas las combinaciones de menor a mayor:
Código (vbnet) [Seleccionar]
       Dim Sorted As List(Of List(Of Integer)) =
           (From combo As List(Of Integer) In Combos
            Order By Convert.ToInt64(String.Join("", combo)) Ascending).ToList


Pero eso no es suficiente, sería algo más complicado de hacer ya que las combinaciones no tienen la misma longitud, los "0" son un añadido después.

Lo mejor es que olvides eso de ordenarlas tú y dejes que el listbox ordene los items por ti:

Código (vbnet) [Seleccionar]
ListBox1.Sorted = True



Saludos.








luis456

Hola
Cuando me dices que pruebe con " ListBox1.Sorted = True " lo hice en diseño o propiedad del listbox y nada tambien lo puse en el codigo y nada


Código (vbnet) [Seleccionar]
Combos.ForEach(Sub(comb As List(Of Integer))

                           ' Convierto la Lista a 'String', le añado los ceros, y añado el string formateado al Listbox.
                           ListBox1.Items.Add(String.Join(", ",
                                                          From value As String In comb
                                                          Select If(value.Length = 1I,
                                                                    value.Insert(0I, "0"c),
                                                                    value)))
                           ListBox1.Sorted = True

                       End Sub)
Que tu sabiduria no sea motivo de Humillacion para los demas

Eleкtro

Cita de: luis456 en 26 Agosto 2014, 20:57 PMnada tambien lo puse en el codigo y nada

No se que significa "nada", Luis.

Mira la imagen de mi último comentario, están las combinaciones ordenadas de menor a mayor, ¿ves alguna diferencia entre ese "output" y el que tu obtienes?, da más detalles, si el código es el que me pasaste y no le has echo modificaciones en este rato entonces tendría que funcionar.

Con que actives la propiedad una sola vez (sea donde sea) es suficiente, sácala del foreach porque la estás activando una y otra vez, de todas formas eso no supondría un problema, pero es innecesario.

saludos








luis456

No me sale y nada significa que no me ordena las combinaciones

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

    ReadOnly Randomizer As New Random

    ' Num ReadOnly FixedValues As Integer() =
    ' Num   Enumerable.Range(1I, 49I).ToArray ' 1 to 30

    ReadOnly FixedValues As Integer() = {1, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50}

    ReadOnly RandomValues As Integer() =
        Enumerable.Range(FixedValues.First, FixedValues.Last).ToArray ' 1 to 30

    Dim Combo As List(Of Integer) = Nothing
    Dim Combos As New List(Of List(Of Integer))

    Private Sub Test() Handles MyBase.Shown

        Dim IndexCounter As Integer = FixedValues.First ' 1
        Dim LenCounter As Integer = 0I

        Const NumStep As Integer = 3I
        Const NumLen As Integer = 10I

        Do Until IndexCounter > FixedValues.Last ' IndexCounter > 30

            Combo = New List(Of Integer)

            For Num As Integer = IndexCounter To (FixedValues.Count) Step NumStep

                LenCounter += 1I
                Combo.Add(FixedValues(Num - 1I))

                If LenCounter >= NumLen Then
                    Exit For
                End If

            Next Num



            If LenCounter < NumLen Then ' If LenCounter < 10

                For RandomNum As Integer = 1I To (NumLen - LenCounter)

                    Dim n As Integer = Randomizer.Next(RandomValues.First, RandomValues.Last)

                    Do Until Not Combo.Contains(n)
                        n = Randomizer.Next(RandomValues.First, RandomValues.Last)
                    Loop

                    Combo.Add(n)

                Next ' RandomNum

            End If ' LenCounter < NumLen

#If DEBUG Then ' #Debug
            Debug.WriteLine(String.Join(", ", Combo))
            ' Stop
#End If

            Combos.Add(Combo)
            IndexCounter += 1I
            LenCounter = 0I

        Loop ' IndexCounter >= FixedValues.Last

        ' ******** ordenamiento-------------
        '  Dim values As Integer() = (From n As Integer In Combos Order By n Ascending).ToArray

        ' ********
        ' Listbox:
        ' ********
        Combos.ForEach(Sub(comb As List(Of Integer))

                           ' Convierto la Lista a 'String', le añado los ceros, y añado el string formateado al Listbox.
                           ListBox1.Items.Add(String.Join(", ",
                                                          From value As String In comb
                                                          Select If(value.Length = 1I,
                                                                    value.Insert(0I, "0"c),
                                                                    value)))
                           ListBox1.Sorted = True

                       End Sub)
    End Sub ' Test

End Class
Que tu sabiduria no sea motivo de Humillacion para los demas

Eleкtro

A mi me las ordena, Luis.

Creo que tu te estás refiriendo que además de ordenar la lista que contiene las combinaciones (de menos a mayor), ¿quieres ordenar los números de cada combinacion, por separado?.

saludos








luis456

Hola

Lo que me refiero es que cada combinación este ordenada de menor a mayor

Tomo una combinación que me da el programa y veras que esta desordenada

01 15 30 45 49 10 39 28 04 03 <-- asi me los pone el código ahora

01 03 04 10 15 28 30 39 45 49 <---asi es que quiero ordenarlos


Luis



Que tu sabiduria no sea motivo de Humillacion para los demas

Eleкtro

Cita de: luis456 en 27 Agosto 2014, 05:31 AMLo que me refiero es que cada combinación este ordenada de menor a mayor

Entonces, antes de añadir la combinación (Combo) a la lista de combinaciones (Combos), ordénala usando el método Sort.

Código (vbnet) [Seleccionar]
Combo.Sort() ' <---- aquí ordeno la combinación actual.

Combos.Add(Combo) ' <---- aquí añado la combinación ordenada al resto de combinaciones.

' y aquí sigo con el código como estaba...
IndexCounter += 1I
LenCounter = 0I
etc...


saludos








luis456

Listo :)    funciona como quería

Muchas gracias elektro

Luis

( nos levantamos pronto ee)
Que tu sabiduria no sea motivo de Humillacion para los demas

luis456

Como contar cuantas combinaciones hay en el listbox ?

Buscando encontre esta rutina funciona pero lo que hace es comparar las combinaciones y decirme que solo hay una combinacion eso lo sabemos ya que el pograma no da repetidos nesecito saber cuantas hay en total.

contar y mostrar    " Combinaciones = 30 "  o la cantidad que salgan :)

codigo que encontre a alguien le puede servir para comparar registros :)

Código (vbnet) [Seleccionar]
' contar que no ay repetidos

    Private Sub Button2_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button2.Click

        Dim query = From item As String In ListBox1.Items.Cast(Of String)() _
                    Order By item _
                    Group By item = item _
                    Into Total = Group, Count() _
                    Select Total

        Dim msg As New System.Text.StringBuilder()

        For Each item In query
            msg.AppendLine(String.Format("Combinaciones {0} existen {1}", item(0), item.Count))
        Next

        MessageBox.Show(msg.ToString())

    End Sub
Que tu sabiduria no sea motivo de Humillacion para los demas

luis456

Solucionado ;)

Código (vbnet) [Seleccionar]
Label1.Text = CStr(ListBox1.Items.Count)


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