Mis malas combinaciones :(

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

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

Eleкtro

Cita de: luis456 en 28 Agosto 2014, 13:23 PMSolucionado ;)

Bien, pero debes intentar interactuar lo más mínimo con la UI.

Código (vbnet) [Seleccionar]
Combos.Count

Saludos








luis456

Gracias Elektro por tus consejos :) ahora tengo otro reto (para mi jeje) no me respondas que voy a ver si lo hago ( si no lo logro, grito auxilio ) tengo este código que ya conoces de sobra jejej

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

    Dim maximum As Short = 99
    Dim x As Integer = 0
    Dim Número As Double
    Private TextBoxes As TextBox() = {Nothing}
    Private Result1 As Int32(), Result2 As Int32(), Result3 As Int32()
    Private _textBox As Object
    Private Property ListBox1Count As Integer
    ReadOnly MAX As Integer = 99

   

    Private Property Calcular As Object

    Private Property TextBox(ByVal TextBoxCount As Short) As Object
        Get
            Return _textBox
        End Get
        Set(ByVal value As Object)
            _textBox = value
        End Set
    End Property

    Public Sub solonumeros(ByRef e As System.Windows.Forms.KeyPressEventArgs)
        ' evitar letras
        If Char.IsDigit(e.KeyChar) Then
            e.Handled = False
        ElseIf Char.IsControl(e.KeyChar) Then
            e.Handled = False
        ElseIf Char.IsSeparator(e.KeyChar) Then
            e.Handled = False
        Else
            e.Handled = True
        End If

    End Sub


    ReadOnly Property Num1 As Int32
        Get
            Return CInt(TextBox1.Text)
        End Get
    End Property

    ReadOnly Property Num2 As Int32
        Get
            Return CInt(TextBox2.Text)
        End Get
    End Property
    ReadOnly Property Num3 As Int32
        Get
            Return CInt(TextBox3.Text)
        End Get
    End Property


    Private Sub Sumar(ByVal sender As Object, ByVal e As EventArgs) Handles Button1.Click


        Result1 = {Num1 + 1, Num1 + 2, Num1 + 4, Num1 + 6, Num1 - 4, Num1 - 1} _
                  .Distinct().ToArray ' Elimino duplicados

        Result2 = {Num2 + 1, Num2 + 2, Num2 + 3, Num2 - 1, Num2 - 2, Num1 - 3} _
                  .Distinct().ToArray ' Elimino duplicados

        Result3 = {Num3 - 1, Num3 - 2, Num3 - 3, Num3 + 2, Num3 + 3, Num3 + 5} _
                  .Distinct().ToArray ' Elimino duplicados


        Dim Rand As New Random
        ' Concateno, y...
        ' Elimino duplicados, y...
        ' Selecciono los números inferiores a MAX, y...
        ' Convierto los números mayores a MAX a números aleatorios entre 0 y MAX.
        Dim Result As IEnumerable(Of Integer) =
            (Result1.Concat(Result2).Concat(Result3)).
            Distinct.
            Select(Function(Value As Integer)
                       Return If(Value < MAX, Value, Rand.Next(0, MAX))
                   End Function)
        ListBox1.Items.AddRange(Result.Cast(Of Object).ToArray)
    End Sub
End Class




Y quiero integrarlo a este que funciona ya gracias a ti :) donde  a la variable " FixedValues " enviarle los datos de la variable " Result "  ya seguro me dara errores del tipo integer :) y esas cosas jejej


Código (vbnet) [Seleccionar]
Imports System.IO

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, 33, 35, 38, 40, 45, 48}

    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 = 5I
        Const NumLen As Integer = 6I

        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
            Combo.Sort()
            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



    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim rutaFichero As String
        Dim i As Integer

        rutaFichero = Path.Combine(Application.StartupPath, "contenido_listbox.txt")
        Dim fichero As New IO.StreamWriter(rutaFichero)
        For i = 0 To ListBox1.Items.Count - 1
            fichero.WriteLine(ListBox1.Items(i))
        Next
        fichero.Close()
    End Sub
    ' contar que no ay repetidos

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

        Label1.Text = CStr(ListBox1.Items.Count)

        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

   
End Class



Gracias por tu paciencia

Luis






Que tu sabiduria no sea motivo de Humillacion para los demas

luis456

jeje AUXILIO, No de verdad que no tengo nocion de como unir esto ;( ya sera que confundo mucho con tantas cosas a la ves

Cuando lo ejecuto de una ves me hace lo del segundo codigo y se supone que debe ser cuando se ejecute el primero y cambie los valores de " FixedValues " con los de  " Result "


Chapuza que tengo echa :)

Código (vbnet) [Seleccionar]
Imports System.IO
Public Class Form1

    Dim maximum As Short = 99
    Dim x As Integer = 0
    Dim Número As Double
    Private TextBoxes As TextBox() = {Nothing}
    Private Result1 As Int32(), Result2 As Int32(), Result3 As Int32()
    Private _textBox As Object
    Private Property ListBox1Count As Integer
    ReadOnly MAX As Integer = 99
    ReadOnly Randomizer As New Random
    Dim Combo As List(Of Integer) = Nothing
    Dim Combos As New List(Of List(Of Integer))

    ReadOnly FixedValues As Integer() = {1, 5, 10, 15, 20, 25, 30, 33, 35, 38, 40, 45, 48}
    ReadOnly RandomValues As Integer() =
        Enumerable.Range(FixedValues.First, FixedValues.Last).ToArray ' 1 to 30


    Private Property Calcular As Object

    Private Property TextBox(ByVal TextBoxCount As Short) As Object
        Get
            Return _textBox
        End Get
        Set(ByVal value As Object)
            _textBox = value
        End Set
    End Property

    Public Sub solonumeros(ByRef e As System.Windows.Forms.KeyPressEventArgs)
        ' evitar letras
        If Char.IsDigit(e.KeyChar) Then
            e.Handled = False
        ElseIf Char.IsControl(e.KeyChar) Then
            e.Handled = False
        ElseIf Char.IsSeparator(e.KeyChar) Then
            e.Handled = False
        Else
            e.Handled = True
        End If

    End Sub


    ReadOnly Property Num1 As Int32
        Get
            Return CInt(TextBox1.Text)
        End Get
    End Property

    ReadOnly Property Num2 As Int32
        Get
            Return CInt(TextBox2.Text)
        End Get
    End Property
    ReadOnly Property Num3 As Int32
        Get
            Return CInt(TextBox3.Text)
        End Get
    End Property


    Private Sub Sumar(ByVal sender As Object, ByVal e As EventArgs) Handles Button1.Click


        Result1 = {Num1 + 1, Num1 + 2, Num1 + 4, Num1 + 6, Num1 - 4, Num1 - 1} _
                  .Distinct().ToArray ' Elimino duplicados

        Result2 = {Num2 + 1, Num2 + 2, Num2 + 3, Num2 - 1, Num2 - 2, Num1 - 3} _
                  .Distinct().ToArray ' Elimino duplicados

        Result3 = {Num3 - 1, Num3 - 2, Num3 - 3, Num3 + 2, Num3 + 3, Num3 + 5} _
                  .Distinct().ToArray ' Elimino duplicados


        Dim Rand As New Random
        ' Concateno, y...
        ' Elimino duplicados, y...
        ' Selecciono los números inferiores a MAX, y...
        ' Convierto los números mayores a MAX a números aleatorios entre 0 y MAX.
        Dim Result As IEnumerable(Of Integer) =
            (Result1.Concat(Result2).Concat(Result3)).
            Distinct.
            Select(Function(Value As Integer)
                       Return If(Value < MAX, Value, Rand.Next(0, MAX))
                   End Function)
        ListBox1.Items.AddRange(Result.Cast(Of Object).ToArray)
        ' ******** ------------------------------------------------------------------


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

    End Sub
    Private Sub Test() Handles MyBase.Shown

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

        Const NumStep As Integer = 5I
        Const NumLen As Integer = 6I

        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
            Combo.Sort()
            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

#33
Citar
Código (vbnet) [Seleccionar]
   Private Sub Test() Handles MyBase.Shown

¿Eso no te dice nada?

Todo lo que hay en el interior de ese bloque se ejecuta en el evento Shown.

La finalidad (según me parece a mi tu intención) sería quitarlo de ahí para meterlo/adaptarlo en el bloque del sub Sumar.

Saludos

EDITO: por lo que dices, quizás pueda ser algo como esto:

Código (vbnet) [Seleccionar]
Imports System.IO
Public Class Form1

   Dim maximum As Short = 99
   Dim x As Integer = 0
   Dim Número As Double
   Private TextBoxes As TextBox() = {Nothing}
   Private Result1 As Int32(), Result2 As Int32(), Result3 As Int32()
   Private _textBox As Object
   Private Property ListBox1Count As Integer
   ReadOnly MAX As Integer = 99
   ReadOnly Randomizer As New Random
   Dim Combo As List(Of Integer) = Nothing
   Dim Combos As New List(Of List(Of Integer))

   Dim FixedValues As Integer() = Nothing
   ReadOnly RandomValues As Integer() =
       Enumerable.Range(0, 99).ToArray


   Private Property Calcular As Object

   Private Property TextBoX(ByVal TextBoxCount As Short) As Object
       Get
           Return _textBox
       End Get
       Set(ByVal value As Object)
           _textBox = value
       End Set
   End Property

   Public Sub solonumeros(ByRef e As System.Windows.Forms.KeyPressEventArgs)
       ' evitar letras
       If Char.IsDigit(e.KeyChar) Then
           e.Handled = False
       ElseIf Char.IsControl(e.KeyChar) Then
           e.Handled = False
       ElseIf Char.IsSeparator(e.KeyChar) Then
           e.Handled = False
       Else
           e.Handled = True
       End If

   End Sub


   ReadOnly Property Num1 As Int32
       Get
           Return CInt(TextBox1.Text)
       End Get
   End Property

   ReadOnly Property Num2 As Int32
       Get
           Return CInt(TextBox2.Text)
       End Get
   End Property
   ReadOnly Property Num3 As Int32
       Get
           Return CInt(TextBox3.Text)
       End Get
   End Property


   Private Sub Sumar(ByVal sender As Object, ByVal e As EventArgs) Handles Button1.Click

       Result1 = {Num1 + 1, Num1 + 2, Num1 + 4, Num1 + 6, Num1 - 4, Num1 - 1} _
                 .Distinct().ToArray ' Elimino duplicados

       Result2 = {Num2 + 1, Num2 + 2, Num2 + 3, Num2 - 1, Num2 - 2, Num1 - 3} _
                 .Distinct().ToArray ' Elimino duplicados

       Result3 = {Num3 - 1, Num3 - 2, Num3 - 3, Num3 + 2, Num3 + 3, Num3 + 5} _
                 .Distinct().ToArray ' Elimino duplicados

       Dim Rand As New Random
       FixedValues =
           (Result1.Concat(Result2).Concat(Result3)).
           Distinct.
           Select(Function(Value As Integer)
                      Return If(Value < MAX, Value, Rand.Next(0, MAX))
                  End Function)

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

       Const NumStep As Integer = 5I
       Const NumLen As Integer = 6I

       Do Until IndexCounter > FixedValues.Last

           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

               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
           Combo.Sort()
           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


End Class


Cosas a tener en cuenta:

1. No le asignes un nombre reservado a una propiedad (TextBox), y asignale el Type de retorno adecuado (no Object)

2. Intenta organizar ese código, es un desastre visual, métodos en medio de propiedades y luego más propiedades, constantes dentro de métodos, algoritmos largos dentro del bloque de un event-handler (aunque bueno, estu último lo añadi yo xD pero ya habia algo ahí de antes), un desastre.









luis456

Bueno ya me vas cojiendo la idea :) y gracias por tu paciencia jeje.

Bien seguimos con los problemas ,y tienes razón en el desorden, es que tengo una mala maña , como quiero que funcione de una no presto atencion al orden y esa es una de mis fallas ;(

Bien lo ejecuto y me da este error en :

No se puede convertir un objeto de tipo 'WhereSelectEnumerableIterator`2[System.Int32,System.Int32]' al tipo 'System.Int32[]'



Código (vbnet) [Seleccionar]
Dim Rand As New Random
        FixedValues =
            (Result1.Concat(Result2).Concat(Result3)).
            Distinct.
            Select(Function(Value As Integer)
                       Return If(Value < MAX, Value, Rand.Next(0, MAX))
                   End Function)

Que tu sabiduria no sea motivo de Humillacion para los demas

Eleкtro

Código (vbnet) [Seleccionar]
       FixedValues =
           (Result1.Concat(Result2).Concat(Result3)).
           Distinct.
           Select(Function(Value As Integer)
                      Return If(Value < MAX, Value, Rand.Next(0, MAX))
                  End Function).ToArray


PD: esto ponlo fuera del sub
Citar
Código (vbnet) [Seleccionar]
       Dim Rand As New Random








luis456

#36
Hola
Hice lo que me pones pero me sigue dando error,


  " no se controlo InvalidCastException "

No se puede convertir un objeto de tipo 'WhereSelectEnumerableIterator`2[System.Int32,System.Int32]' al tipo 'System.Int32[]'.



sugerencias " Cuando realiza la conversion de un numero,el valor debe ser un numero menor que intinito "
" asegurese que el tipo de origen se puede convertir en el tipo de destino"


SOLUCIONADO " Cada dia me pongo mas ciego y leo mal jejeje )


gracias Elektro

Luis



Que tu sabiduria no sea motivo de Humillacion para los demas

luis456

otro rollo jejej

Trasteando para aumentar los números ahora me encuentro este error cuando ejecuto el programa pero lo curioso es que con algunos numeros que introduzco no lo hace y variando estos números ( imput) si me sale el error ? si entiendo que se sale de la capacidad del la variable pero lo que no entiendo donde aumentar esta capacidad


" Índice fuera de los límites de la matriz "



Código (vbnet) [Seleccionar]
For Num As Integer = IndexCounter To (FixedValues.Count) Step NumStep

                LenCounter += 1I
                Combo.Add(FixedValues(Num - 1I)) '<-------Índice fuera de los límites de la matriz.
                If LenCounter >= NumLen Then
                    Exit For
                End If

            Next Num




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

Eleкtro

#38
Los índices empiezan por Cero en .Net, así que debes descontarle un 1 a FixedValues.Count (no debes aumentar nada)

Código (vbnet) [Seleccionar]
For Num As Integer = IndexCounter To (FixedValues.Count - 1I) Step NumStep

Supongo que eso debería solucionar el problema, quizás haya más cosas a tener en cuenta (IndexCounter, NumStep), pero de momento prueba lo que te dije a ver si te da el resultado que tu esperas.

Saludos!








luis456

#39
Sigue igual :(

sera porque la función que estoy empleando no tiene un largo especifico ? ya que como me da 50 números unas veces otras  también puede dar 80 o sea que los números a combinar nunca son del mismo largo o cantidades ..

Edito) me he dado cuenta que si colocoal principio en el imput números desde el 01 hasta el 09 me produce el error y a partir del numero 10 no lo hace ???

" Índice fuera de los límites de la matriz "

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