Autor
|
Tema: Mis malas combinaciones :( (Leído 22,255 veces)
|
Eleкtro
Ex-Staff
Conectado
Mensajes: 9.819
|
Solucionado Bien, pero debes intentar interactuar lo más mínimo con la UI. Combos.Count
Saludos
|
|
|
En línea
|
|
|
|
luis456
Desconectado
Mensajes: 548
|
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 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 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 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
|
|
|
En línea
|
Que tu sabiduria no sea motivo de Humillacion para los demas
|
|
|
luis456
Desconectado
Mensajes: 548
|
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 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 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
|
|
|
En línea
|
Que tu sabiduria no sea motivo de Humillacion para los demas
|
|
|
Eleкtro
Ex-Staff
Conectado
Mensajes: 9.819
|
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: 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 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.
|
|
« Última modificación: 28 Agosto 2014, 21:02 pm por Eleкtro »
|
En línea
|
|
|
|
luis456
Desconectado
Mensajes: 548
|
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[]' 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)
|
|
|
En línea
|
Que tu sabiduria no sea motivo de Humillacion para los demas
|
|
|
Eleкtro
Ex-Staff
Conectado
Mensajes: 9.819
|
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
|
|
|
En línea
|
|
|
|
luis456
Desconectado
Mensajes: 548
|
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
|
|
« Última modificación: 29 Agosto 2014, 12:32 pm por luis456 »
|
En línea
|
Que tu sabiduria no sea motivo de Humillacion para los demas
|
|
|
luis456
Desconectado
Mensajes: 548
|
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 " 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
|
|
|
En línea
|
Que tu sabiduria no sea motivo de Humillacion para los demas
|
|
|
Eleкtro
Ex-Staff
Conectado
Mensajes: 9.819
|
Los índices empiezan por Cero en .Net, así que debes descontarle un 1 a FixedValues.Count (no debes aumentar nada) 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!
|
|
« Última modificación: 29 Agosto 2014, 15:58 pm por Eleкtro »
|
En línea
|
|
|
|
luis456
Desconectado
Mensajes: 548
|
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
|
|
« Última modificación: 29 Agosto 2014, 16:54 pm por luis456 »
|
En línea
|
Que tu sabiduria no sea motivo de Humillacion para los demas
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
Instrucciones malas :P
Ingeniería Inversa
|
x64core
|
3
|
2,920
|
7 Diciembre 2011, 16:45 pm
por Flamer
|
|
|
Combinaciones con subrangos
.NET (C#, VB.NET, ASP)
|
luis456
|
1
|
1,689
|
25 Noviembre 2014, 12:20 pm
por Eleкtro
|
|
|
Usuarios de Yelp bombardean pizzería antigay con malas reseñas
« 1 2 3 4 5 »
Noticias
|
wolfbcn
|
47
|
11,124
|
5 Abril 2015, 03:10 am
por MinusFour
|
|
|
Mas combinaciones condicionadas
.NET (C#, VB.NET, ASP)
|
luis456
|
0
|
1,334
|
5 Abril 2016, 11:42 am
por luis456
|
|
|
Vulnerabilidades por malas practicas streaming
Bugs y Exploits
|
neftali.evando88
|
5
|
7,193
|
23 Octubre 2020, 20:44 pm
por MCKSys Argentina
|
|