Autor
|
Tema: Combis :( (Leído 4,936 veces)
|
luis456
Desconectado
Mensajes: 548
|
Hola estoy creando este codigo para combinar numeros de dos en dos pero me sale un error que no habia visto antes " No se puede inferir el tipo de 'k' porque los límites del bucle y la cláusula step no se convierten en el mismo tipo " Public Class Form1 Dim NumElementos As IEnumerable(Of Integer) = {0, 3, 4, 5, 8} {01, 13, 34, 55, 84} Sub Combinaciones() For k = 2 To NumElementos i = i + 1 For j = k To NumElementos Next j Next k End Sub End Class
Luis
|
|
« Última modificación: 20 Marzo 2016, 16:18 pm por luis456 »
|
En línea
|
Que tu sabiduria no sea motivo de Humillacion para los demas
|
|
|
Lekim
Desconectado
Mensajes: 268
|
Hola Podrías especificar un poco más. ¿Qué quieres hacer exactamente? ¿Combinar números de dos en dos aleatoriamente o de forma consecutiva a partir de un grupo de números? En cualquier caso tu código tiene un montón de fallos, además no especificas tampoco cual es error que te marca (que hay muchos) para empezar la declaración For/Next croe que debería ser: For k = 0 To NumElementos.Count -1 Next k
por otro lado ¿Esto así? Dim NumElementos As IEnumerable(Of Integer) = {0, 3, 4, 5, 8} {01, 13, 34, 55, 84} ¿No será que lo quieres así?: Dim NumElementos As IEnumerable(Of Integer) = {0, 3, 4, 5, 8, 1, 13, 34, 55, 84} En fin, explícate un poco Podría ser algo así? Public Class Form1 Dim NumElementos As New ArrayList({0, 3, 4, 5, 8, 1, 13, 34, 55, 84}) Sub Combinaciones() Dim N As New Random Dim num As String = Nothing For k As Integer = 1 To (NumElementos.Count / 2) num = "" For j As Integer = 0 To 1 Dim NumAlt As Integer = NumElementos(N.Next(NumElementos.Count)) NumElementos.Remove(NumAlt) num += NumAlt.ToString Next MessageBox.Show(num) Next End Sub Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Combinaciones() End Sub End Class
O podría ser esto... Esto combina los números de NumElementos con los de NumElementos2, de dos en dos y de forma aleatoria. Public Class Form1 Dim NumElementos As New ArrayList({0, 3, 4, 5, 8}) Dim NumElementos2 As New ArrayList({1, 13, 34, 55, 84}) Sub Combinaciones() Dim N As New Random Dim num As String = Nothing For k As Integer = 1 To 5 num = "" Dim NumAlt As Integer = NumElementos(N.Next(NumElementos.Count)) Dim NumAlt2 As Integer = NumElementos2(N.Next(NumElementos2.Count)) NumElementos.Remove(NumAlt) NumElementos2.Remove(NumAlt2) num = NumAlt.ToString & "-" & NumAlt2.ToString MessageBox.Show(num) Next End Sub Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Combinaciones() End Sub End Class
|
|
« Última modificación: 18 Marzo 2016, 22:02 pm por Lekim »
|
En línea
|
|
|
|
luis456
Desconectado
Mensajes: 548
|
Hola Podrías especificar un poco más. ¿Qué quieres hacer exactamente? ¿Combinar números de dos en dos aleatoriamente o de forma consecutiva a partir de un grupo de números? En cualquier caso tu código tiene un montón de fallos, además no especificas tampoco cual es error que te marca (que hay muchos) para empezar la declaración For/Next croe que debería ser: For k = 0 To NumElementos.Count -1 Next k
por otro lado ¿Esto así? Dim NumElementos As IEnumerable(Of Integer) = {0, 3, 4, 5, 8} {01, 13, 34, 55, 84} ¿No será que lo quieres así?: Dim NumElementos As IEnumerable(Of Integer) = {0, 3, 4, 5, 8, 1, 13, 34, 55, 84} En fin, explícate un poco Podría ser algo así? Public Class Form1 Dim NumElementos As New ArrayList({0, 3, 4, 5, 8, 1, 13, 34, 55, 84}) Sub Combinaciones() Dim N As New Random Dim num As String = Nothing For k As Integer = 1 To (NumElementos.Count / 2) num = "" For j As Integer = 0 To 1 Dim NumAlt As Integer = NumElementos(N.Next(NumElementos.Count)) NumElementos.Remove(NumAlt) num += NumAlt.ToString Next MessageBox.Show(num) Next End Sub Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Combinaciones() End Sub End Class
O podría ser esto... Esto combina los números de NumElementos con los de NumElementos2, de dos en dos y de forma aleatoria. Public Class Form1 Dim NumElementos As New ArrayList({0, 3, 4, 5, 8}) Dim NumElementos2 As New ArrayList({1, 13, 34, 55, 84}) Sub Combinaciones() Dim N As New Random Dim num As String = Nothing For k As Integer = 1 To 5 num = "" Dim NumAlt As Integer = NumElementos(N.Next(NumElementos.Count)) Dim NumAlt2 As Integer = NumElementos2(N.Next(NumElementos2.Count)) NumElementos.Remove(NumAlt) NumElementos2.Remove(NumAlt2) num = NumAlt.ToString & "-" & NumAlt2.ToString MessageBox.Show(num) Next End Sub Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Combinaciones() End Sub End Class
Gracias por tu atención y disculpa que haya tardado en responder LO que estoy tratando de hacer es que de una serie de números contenidos en la variable se combinen de dos en dos y perdón que no puse que son de esta manera son números de dos dígitos entrada 01. 03, 04, 05, 08, 13, 34, 55, 84 salida 01, 03 01, 04 01, 05 01, 08 01, 13 01, 34 01, 55 01, 84 03,04 03,05 03,08 03,13 ............................... asi con todos hasta acabar la secuencia Y de nuevo gracias Luis
|
|
|
En línea
|
Que tu sabiduria no sea motivo de Humillacion para los demas
|
|
|
Eleкtro
Ex-Staff
Desconectado
Mensajes: 9.788
|
" No se puede inferir el tipo de 'k' porque los límites del bucle y la cláusula step no se convierten en el mismo tipo " Hola! Te está diciendo que no se puede inferir el tipo (sin asignar) de K, por que difiere del tipo de NumElementos. Ese problema que se ve reflejado en la excepción es por que estás usando malas prácticas de las que ya te advertí en el pasado, debes intentar especificar explicitamente SIEMPRE el tipo de un objeto en lugar de dejar que el compiler lo intente inferir y así evitar ese tipo de errores. Ejemplo: For K As Integer = 2 ... El segundo problema es que NumElementos no es un tipo Integer, sino una colección, así que lo que debes usar es la propiedad Count de dicha colección.
Puedes hacerlo de la siguiente manera: Dim intCol As IEnumerable(Of Integer) = {1, 3, 4, 5, 8, 13, 34, 55, 84, 99} Dim sb As New StringBuilder(capacity:=100) For x As Integer = 0 To (intCol.Count - 1) Step 2 If (x < (intCol.Count - 1)) Then sb.Append(String.Format("{0:00}, {1:00}", intCol(x), intCol(x + 1))) Else sb.Append(String.Format("{0:00}", intCol(x))) End If sb.AppendLine() Next Console.WriteLine(sb.ToString)
Resultado de ejecución: 01, 03 04, 05 08, 13 34, 55 84, 99 PD: ¿Algún "pero" esta vez? .
|
|
« Última modificación: 19 Marzo 2016, 19:48 pm por Eleкtro »
|
En línea
|
|
|
|
Lekim
Desconectado
Mensajes: 268
|
Hola Jaja, ahora queda más claro, gracias Dim NumElementos As IEnumerable(Of Integer) = {1, 3, 84, 99}, Secuencia As String = Nothing For Each N As Integer In NumElementos For I As Integer = 0 To NumElementos.Count - 1 Secuencia += String.Format("{0:00}, {1:00}{2}", N, NumElementos(I), Environment.NewLine) Next Next MessageBox.Show(Secuencia)
S2s
Explicación para añadir ceros delante de un número: String.Format("{0}", 5) ---> devuelve "5" String.Format("{0} {1}", 5, 25) ---> devuelve "5 25" String.Format("{0}, {1}", 5, 25) ---> devuelve "5, 25" String.Format("{0:00}", 5) ---> devuelve "05" String.Format("{0:00}", 25) ---> devuelve "25" String.Format("{0:00} {1:00}", 5, 25) ---> devuelve "05 25" String.Format("{0:00} {1:00} {2:00}" , 5, 25, 8) ---> devuelve "05 25 08" String.Format("{0:00}, {1:00}, {2:00}" , 5, 25, 8) ---> devuelve "05, 25, 08"
|
|
« Última modificación: 20 Marzo 2016, 14:42 pm por Lekim »
|
En línea
|
|
|
|
luis456
Desconectado
Mensajes: 548
|
PD: ¿Algún "pero" esta vez? . Jejejje luche hasta el final para que no hubiera " PERO " Probando el codigo de elektro ahora me muestra esto (el codigo que me mostro Lekim le consegui otro uso me vino de perlas ) coleccion de numeros ( 1, 3, 4, 5, 8, 13, 34, 55, 84, 99 ) 01 03 04 05 08 13 34 55 84 99 Pero jejje Yo nesecito me nuestre 01, 03 01, 04 01, 05 01, 08 01, 13 01, 34 01, 55 01, 84 despues se toma el seiguiente numero en este caso el tres y se combina haci hasta acabar con todos los numeros 03,04 03,05 03,08 03,13 Dim intCol As IEnumerable(Of Integer) = {1, 3, 4, 5, 8, 13, 34, 55, 84, 99} Dim sb As New StringBuilder(capacity:=100) For x As Integer = 0 To (intCol.Count - 1) Step 2 If (x < (intCol.Count - 1)) Then sb.Append(String.Format("{0:00}, {1:00}", intCol(x), intCol(x + 1))) Else sb.Append(String.Format("{0:00}", intCol(x))) End If sb.AppendLine() Next MessageBox.Show(sb.ToString)
Luis
|
|
|
En línea
|
Que tu sabiduria no sea motivo de Humillacion para los demas
|
|
|
luis456
Desconectado
Mensajes: 548
|
Hola Jaja, ahora queda más claro, gracias Dim NumElementos As IEnumerable(Of Integer) = {1, 3, 84, 99}, Secuencia As String = Nothing For Each N As Integer In NumElementos For I = 0 To NumElementos.Count - 1 Secuencia += String.Format("{0:00}, {1:00}{2}", N, NumElementos(I), Environment.NewLine) Next Next MessageBox.Show(Secuencia)
S2s
Explicación para añadir ceros delante de un número: String.Format("{0}", 5) ---> devuelve "5" String.Format("{0} {1}", 5, 25) ---> devuelve "5 25" String.Format("{0}, {1}", 5, 25) ---> devuelve "5, 25" String.Format("{0:00}", 5) ---> devuelve "05" String.Format("{0:00}", 25) ---> devuelve "25" String.Format("{0:00} {1:00}", 5, 25) ---> devuelve "05 25" String.Format("{0:00} {1:00} {2:00}" , 5, 25, 8) ---> devuelve "05 25 08" String.Format("{0:00}, {1:00}, {2:00}" , 5, 25, 8) ---> devuelve "05, 25, 08" Mientras escribia hacias lo mismo lo pruebo gracias Luis
|
|
|
En línea
|
Que tu sabiduria no sea motivo de Humillacion para los demas
|
|
|
Lekim
Desconectado
Mensajes: 268
|
Si lo prefieres puedes meter la lista en un Array. Dim NumElementos As IEnumerable(Of Integer) = {1, 3, 84, 99}, Secuencia As New List(Of String) For Each N As Integer In NumElementos For I As Integer = 0 To NumElementos.Count - 1 Secuencia.Add(String.Format("{0:00}, {1:00}", N, NumElementos(I))) Next Next '//Mete los elementos del Array (List) en una Variable String y la muestra Dim lista As String = Nothing For Each S As String In Secuencia : lista += S + Environment.NewLine : Next MessageBox.Show(lista)
|
|
|
En línea
|
|
|
|
Eleкtro
Ex-Staff
Desconectado
Mensajes: 9.788
|
Probando el codigo de elektro ahora me muestra esto (el codigo que me mostro Lekim le consegui otro uso me vino de perlas )
coleccion de numeros ( 1, 3, 4, 5, 8, 13, 34, 55, 84, 99 )
01 03 04 05 08 13 34 55 84 99
Pero jejje Yo nesecito me nuestre
01, 03 01, 04 01, 05 01, 08 01, 13 01, 34 01, 55 01, 84 Tienes razón, culpa mia, no entendí bien el problema que querías resolver al leerlo deprisa, y simplemente tomé los valores en grupos de dos en dos, que es lo que creí que querías hacer. Entonces lo que realmente quieres hacer es esto: Dim intCol As IEnumerable(Of Integer) = {1, 3, 4, 5, 8, 13, 34, 55, 84, 99} Dim count As Integer Dim pairsCol As IEnumerable(Of String) = From value1 As Integer In intCol Select String.Join(Environment.NewLine, ( From value2 As Integer In intCol.Skip(Interlocked.Increment(count)) Select String.Format("{0:00}, {1:00}", value1, value2))) For Each pairs As String In pairsCol Console.WriteLine(pairs) Console.WriteLine("------") Next
Resultado de ejecución: 01, 03 01, 04 01, 05 01, 08 01, 13 01, 34 01, 55 01, 84 01, 99 ------ 03, 04 03, 05 03, 08 03, 13 03, 34 03, 55 03, 84 03, 99 ------ 04, 05 04, 08 04, 13 04, 34 04, 55 04, 84 04, 99 ------ 05, 08 05, 13 05, 34 05, 55 05, 84 05, 99 ------ 08, 13 08, 34 08, 55 08, 84 08, 99 ------ 13, 34 13, 55 13, 84 13, 99 ------ 34, 55 34, 84 34, 99 ------ 55, 84 55, 99 ------ 84, 99 O sino, debe ser esto otro: Dim intCol As IEnumerable(Of Integer) = {1, 3, 4, 5, 8, 13, 34, 55, 84, 99} Dim pairsCol As IEnumerable(Of String) = From value1 As Integer In intCol Select String.Join(Environment.NewLine, ( From value2 As Integer In intCol Where (value2 <> value1) Select String.Format("{0:00}, {1:00}", value1, value2))) For Each pairs As String In pairsCol Console.WriteLine(pairs) Console.WriteLine("------") Next
Resultado de ejecución: 01, 03 01, 04 01, 05 01, 08 01, 13 01, 34 01, 55 01, 84 01, 99 ------ 03, 01 03, 04 03, 05 03, 08 03, 13 03, 34 03, 55 03, 84 03, 99 ------ 04, 01 04, 03 04, 05 04, 08 04, 13 04, 34 04, 55 04, 84 04, 99 ------ 05, 01 05, 03 05, 04 05, 08 05, 13 05, 34 05, 55 05, 84 05, 99 ------ 08, 01 08, 03 08, 04 08, 05 08, 13 08, 34 08, 55 08, 84 08, 99 ------ 13, 01 13, 03 13, 04 13, 05 13, 08 13, 34 13, 55 13, 84 13, 99 ------ 34, 01 34, 03 34, 04 34, 05 34, 08 34, 13 34, 55 34, 84 34, 99 ------ 55, 01 55, 03 55, 04 55, 05 55, 08 55, 13 55, 34 55, 84 55, 99 ------ 84, 01 84, 03 84, 04 84, 05 84, 08 84, 13 84, 34 84, 55 84, 99 ------ 99, 01 99, 03 99, 04 99, 05 99, 08 99, 13 99, 34 99, 55 99, 84 ------
|
|
« Última modificación: 20 Marzo 2016, 15:13 pm por Eleкtro »
|
En línea
|
|
|
|
Lekim
Desconectado
Mensajes: 268
|
hola de nuevo... Bueno, creo que la pregunta está mas que respondida, pero tras revisar los comentarios me di cuenta que la secuencia de mi código, aunque lógica no era la que demandabas, así que pongo la rectificación y fiel a mi estilo ya que hay códigos que se entienden mejor que otros. Dim NumElementos As IEnumerable(Of Integer) = {1, 3, 84, 99}, Secuencia As String = Nothing Dim nu As Integer = 0 For Each N As Integer In NumElementos : nu += 1 For I As Integer = nu To NumElementos.Count - 1 If N <> NumElementos(I) Then _ Secuencia += String.Format("{0:00}, {1:00}{2}", N, NumElementos(I), Environment.NewLine) Next Next MessageBox.Show(Secuencia)
Devuelve 01, 03 01, 84 01, 99 03, 84 03, 99 84, 99 ( he reducido la secuencia pero puedes poner tantos números como quieras) O bien: Dim NumElementos As IEnumerable(Of Integer) = {1, 3, 84, 99}, Secuencia As String = Nothing For Each N As Integer In NumElementos For I As Integer = 0 To NumElementos.Count - 1 If N <> NumElementos(I) Then _ Secuencia += String.Format("{0:00}, {1:00}{2}", N, NumElementos(I), Environment.NewLine) Next Next MessageBox.Show(Secuencia)
Devuelve: 01, 03 01, 84 01, 99 03, 01 03, 84 03, 99 84, 01 84, 03 84, 99 99, 01 99, 03 99, 84 S2s
|
|
« Última modificación: 20 Marzo 2016, 16:10 pm por Lekim »
|
En línea
|
|
|
|
|
|