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
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
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í?
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
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:
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.
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"
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
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
Cita de: Lekim en 20 Marzo 2016, 14:13 PM
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
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)
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:
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:
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
------
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
Cita de: Lekim en 20 Marzo 2016, 16:05 PM
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, 868}, 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
Perfecto y gracias por tu ayuda, ya que sin querer me ayudaste con el primer código que me pusiste con otra duda que tenia diferente a la planteada, super agradecido a ti ya a elektro por tan valiosa colaboración aunque siempre con elektro da miedo preguntar jejejje es muy regañón (el sabe que es con aprecio jejej )
Dare por solucionado este post y espero que le valga a otros muchos estos códigos ya que realmente son combinatorias y suelen ser útiles sobre todo para los que trabajan con Claves ::)
Saludos
Luis
De nada,
bueno en el código que has citado se me coló un 868, :P porque estaba haciendo pruebas, por si acaso. En cuyo caso devolvería..
01, 03
01, 84
01, 99
01, 868
03, 84
03, 99
03, 868
84, 99
84, 868
99, 868
S2s
Además... que sobra la comparación If N <> NumElementos ... en la secuencia del primer ejemplo. (Esto me ha ocurrido porque el primer ejemplo lo obtuve a partir del segundo, jeje)
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
Secuencia += String.Format("{0:00}, {1:00}{2}", N, NumElementos(I), Environment.NewLine)
Next
Next
MessageBox.Show(Secuencia)