Combis :(

Iniciado por luis456, 18 Marzo 2016, 19:22 PM

0 Miembros y 2 Visitantes están viendo este tema.

luis456

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 "



Código (vbnet) [Seleccionar]
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
Que tu sabiduria no sea motivo de Humillacion para los demas

Lekim

#1
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í?

Código (vbnet) [Seleccionar]
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.

Código (vbnet) [Seleccionar]
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

luis456

Cita de: Lekim en 18 Marzo 2016, 19:44 PM
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í?

Código (vbnet) [Seleccionar]
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.

Código (vbnet) [Seleccionar]
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


















Que tu sabiduria no sea motivo de Humillacion para los demas

Eleкtro

#3
Cita de: luis456 en 18 Marzo 2016, 19:22 PM" 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:
CitarFor 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:

Código (vbnet) [Seleccionar]
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:
Citar01, 03
04, 05
08, 13
34, 55
84, 99

PD: ¿Algún "pero" esta vez? :P.








Lekim

#4
Hola

Jaja, ahora queda más claro, gracias  ;-)

Código (vbnet) [Seleccionar]

       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"  




luis456

PD: ¿Algún "pero" esta vez? :P.


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

Código (vbnet) [Seleccionar]
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


Que tu sabiduria no sea motivo de Humillacion para los demas

luis456

Cita de: Lekim en 20 Marzo 2016, 14:13 PM
Hola

Jaja, ahora queda más claro, gracias  ;-)

Código (vbnet) [Seleccionar]

       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

Que tu sabiduria no sea motivo de Humillacion para los demas

Lekim

Si lo prefieres puedes meter la lista en un Array.

Código (vbnet) [Seleccionar]
       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)

Eleкtro

#8
Cita de: luis456 en 20 Marzo 2016, 14:23 PMProbando 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:
Código (vbnet) [Seleccionar]
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:
Citar01, 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:
Código (vbnet) [Seleccionar]
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:
Citar01, 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
------








Lekim

#9
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.

Código (vbnet) [Seleccionar]

      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:

Código (vbnet) [Seleccionar]

     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