Otra de las mias jejje traspasar datos condicionados de una variable a otras

Iniciado por luis456, 3 Marzo 2015, 23:07 PM

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

luis456

Bueno otro de mis inventos chungos

tengo una variable x2 integer que contiene x (es variable la cantidad) de numeros que contendria esta variable, ya saben el famoso 00 al 99 y quiero asignar a otras variables digamos variable  lx1 los primeros cuatro numeros de la variable x2 y despues los siguientes otros cuatro numeros a otra variable  lx2 y a si con todos los numeros de la variable x2 hasta acabar con todos,


Espero se entienda :)

Gracias
Luis



Que tu sabiduria no sea motivo de Humillacion para los demas

MCLucro

Muestranos por lo menos algo de código que hayas intentado hacer porque parece que quieres que te hagan la tarea jaja ;P .
Pero bueno, así a voz de pronto (no te voy a poner código) te podría sugerir almacenar los numeros del 00 al 99 en un vector y otro vector con las variables que vamos a utilizar para copiar los datos. Hecho esto haces un ciclo for que recorra desde el 00 al 99. Dentro del ciclo habría un puntero que apuntaría a la dirección de memoria de la variable donde quieres copiar los datos. La magia del ejercicio sería hacer una condición del tipo if(i%4==0)(siendo i el contador del ciclo for), y cuando esta condicion se cumpla cambiaríamos la posicion de memoria a la que apunta nuestro puntero a la dirección de memoria de otra variable en nuestro vector de variables. Creo que más o menos si sigues estas instrucciones encontrarás el resultado que quieres.

Eleкtro

Si no he entendido mal, tienes una colección de números cómo esta:
Código (vbnet) [Seleccionar]
Dim collection As IEnumerable(Of Integer) = Enumerable.Range(1, 99)

Y quieres partirlo en colecciones de 4 elementos cada una:
Código (vbnet) [Seleccionar]
Dim parts As Integer = 4

Pues, cómo siempre te digo, usa LINQ:
Código (vbnet) [Seleccionar]

Dim result As IEnumerable(Of IEnumerable(Of Integer)) =
   From index As Integer
    In Enumerable.Range(0, CInt(Math.Ceiling(collection.Count() / parts)))
   Select collection.Skip(index * parts).Take(parts)


Saludos








luis456

Cita de: Eleкtro en  4 Marzo 2015, 09:43 AM
Si no he entendido mal, tienes una colección de números cómo esta:
Código (vbnet) [Seleccionar]
Dim collection As IEnumerable(Of Integer) = Enumerable.Range(1, 99)

Y quieres partirlo en colecciones de 4 elementos cada una:
Código (vbnet) [Seleccionar]
Dim parts As Integer = 4

Pues, cómo siempre te digo, usa LINQ:
Código (vbnet) [Seleccionar]

Dim result As IEnumerable(Of IEnumerable(Of Integer)) =
   From index As Integer
    In Enumerable.Range(0, CInt(Math.Ceiling(collection.Count() / parts)))
   Select collection.Skip(index * parts).Take(parts)


Saludos


Bueno  como soy un poco subnormal con esto, estaba modificando la función que entrega los números en variables apartes usando  para limitar con " take = 4) y después concatenando las variables resultantes ???? toda una chapuza jejej

Me he puesto con tu codigo pero siempre me pasa lo mismo al mostrar :(

Código (vbnet) [Seleccionar]
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        Dim collection As IEnumerable(Of Integer) = Enumerable.Range(1, 99)

        Dim parts As Integer = 4


        Dim result As IEnumerable(Of IEnumerable(Of Integer)) =
    From index As Integer
    In Enumerable.Range(0, CInt(Math.Ceiling(collection.Count() / parts)))
    Select collection.Skip(index * parts).Take(parts)

        ListBox1.Items.AddRange(parts.Cast(Of Object).ToArray) <----error como siempre

    End Sub



Luis








Que tu sabiduria no sea motivo de Humillacion para los demas

Eleкtro

Cita de: luis456 en  5 Marzo 2015, 11:55 AM
Código (vbnet) [Seleccionar]
ListBox1.Items.AddRange(parts.Cast(Of Object).ToArray) <----error como siempre

Ese error ya lo sufriste anteriormente por la mimsa causa y te expliqué el motivo.

Primero de nada, en el código que he citado, al método ListBox.Items.AddRange() le estás pasando la variable 'parts' que solo es un simple valor Integer, así que voy a hacer cómo que no he leido eso y vamos a suponer que al método le pasas la variable 'result', que es en realidad lo que le querrías intentar pasar, quedando así:
Código (vbnet) [Seleccionar]
ListBox1.Items.AddRange(result.Cast(Of Object).ToArray)

El método ListBox.Items.AddRange() espera que le pases como parámetro un array de objetos (una colección de strings por ejemplo, IEnumerable(Of String).Cast(Of Object).ToArray, o un array, New Object() {1,2,3}).

Pero 'result' es una colección que contiene sub-colecciones ( IEnumerable(Of IEnumerable(Of T)) ), no es un tipo de valor que vayas a poder visualizar en el listbox, por que tienes que pasarle un array que contenga los elementos que quieras mostrar (los valores Integer), no pasarle un array que contenga más arrays.

piensa, ¿qué debes hacer?, ¿debo volver a decírte lo que siempre te digo qué debes usar para resolver la mayoría de los problemas que tienes? (eso ha sido una pista), jeje.

Saludos!








luis456

Cita de: Eleкtro en  5 Marzo 2015, 13:03 PM
Ese error ya lo sufriste anteriormente por la mimsa causa y te expliqué el motivo.

Primero de nada, en el código que he citado, al método ListBox.Items.AddRange() le estás pasando la variable 'parts' que solo es un simple valor Integer, así que voy a hacer cómo que no he leido eso y vamos a suponer que al método le pasas la variable 'result', que es en realidad lo que le querrías intentar pasar, quedando así:
Código (vbnet) [Seleccionar]
ListBox1.Items.AddRange(result.Cast(Of Object).ToArray)

El método ListBox.Items.AddRange() espera que le pases como parámetro un array de objetos (una colección de strings por ejemplo, IEnumerable(Of String).Cast(Of Object).ToArray, o un array, New Object() {1,2,3}).

Pero 'result' es una colección que contiene sub-colecciones ( IEnumerable(Of IEnumerable(Of T)) ), no es un tipo de valor que vayas a poder visualizar en el listbox, por que tienes que pasarle un array que contenga los elementos que quieras mostrar (los valores Integer), no pasarle un array que contenga más arrays.

piensa, ¿qué debes hacer?, ¿debo volver a decírte lo que siempre te digo qué debes usar para resolver la mayoría de los problemas que tienes? (eso ha sido una pista), jeje.

Saludos!


Hola ya se LINQ: LINQ: LINQ: jejej  no se donde esta ese código que me hiciste que es parecido a esto, lo unico que me acuerdo es que tengo que crear una nueva lista (no se si me vuelvo a equivocar  jeje ) por cierto he estado estudiando lo de LINQ: y me tope con esto que se parece a lo que estuvimos haciendo la otra ves lo malo es que puedo ir creando uno por uno modificando la condiciones pero se me hace muyyy largo jejej esto es muy similar a lo que quiero hacer


Codigo
Código (vbnet) [Seleccionar]
' mostrar lo que quiera de dos en dos o tres en tres.
        Dim numbers() As Integer = {0, 1, 2, 3, 4, 5, 6, 10, 15, 20, 25, 30, 35, 45}

        '
        Dim evensQuery = From num In numbers
                         Where num Mod 2 = 1
                         Select num

        ListBox2.Items.AddRange(evensQuery.Cast(Of Object).ToArray)



muestra

1
3
5
15
25
35
45

Como veras salta de tres entres 1 3 5 etc pero esto solo lo hace una ves, la pregunta es como se podría hacer para que haga lo mismo  (bucle imagino ) arranque con lo mismo pero desde el siguiente numero en este caso el numero  2 4 6 15 25 35 45 y aci con todos

luis

Que tu sabiduria no sea motivo de Humillacion para los demas

luis456

Cita de: Eleкtro en  5 Marzo 2015, 13:03 PM
Ese error ya lo sufriste anteriormente por la mimsa causa y te expliqué el motivo.

Primero de nada, en el código que he citado, al método ListBox.Items.AddRange() le estás pasando la variable 'parts' que solo es un simple valor Integer, así que voy a hacer cómo que no he leido eso y vamos a suponer que al método le pasas la variable 'result', que es en realidad lo que le querrías intentar pasar, quedando así:
Código (vbnet) [Seleccionar]
ListBox1.Items.AddRange(result.Cast(Of Object).ToArray)

El método ListBox.Items.AddRange() espera que le pases como parámetro un array de objetos (una colección de strings por ejemplo, IEnumerable(Of String).Cast(Of Object).ToArray, o un array, New Object() {1,2,3}).

Pero 'result' es una colección que contiene sub-colecciones ( IEnumerable(Of IEnumerable(Of T)) ), no es un tipo de valor que vayas a poder visualizar en el listbox, por que tienes que pasarle un array que contenga los elementos que quieras mostrar (los valores Integer), no pasarle un array que contenga más arrays.

piensa, ¿qué debes hacer?, ¿debo volver a decírte lo que siempre te digo qué debes usar para resolver la mayoría de los problemas que tienes? (eso ha sido una pista), jeje.

Saludos!


Bueno dejando lo otro vuelvo al problema inicial por mas que miro Linq en  msdn.microsoft.com no logro controlar esto lo unico que he podido hacer es mostrar los numeros jejej y revizando los codigos de elektro lo que consegui fue el ejemplo pero era para combinar

codigo

Código (vbnet) [Seleccionar]
Dim collection As IEnumerable(Of Integer) = Enumerable.Range(1, 99)

        Dim parts As Integer = 4


        Dim result As IEnumerable(Of IEnumerable(Of Integer)) =
    From index As Integer
    In Enumerable.Range(0, CInt(Math.Ceiling(collection.Count() / parts)))
    Select collection.Skip(index * parts).Take(parts)

        ListBox5.Items.Add(String.Join(", ", From index As Integer In collection
                                                                      Select If(index.ToString.Length = 1I,
                                                                                index.ToString.Insert(0I, "0"c),
                                                                                index.ToString)))





Luis


Que tu sabiduria no sea motivo de Humillacion para los demas

luis456

A ver que estoy mal ? he probado y reprobado y no me sale

Código (vbnet) [Seleccionar]
'  Dim collection As IEnumerable(Of Integer) = Enumerable.Range(1, 11)
        Dim collection() As Integer = {1, 2, 3, 4, 5, 6, 10, 15, 20, 22, 24, 25, 30, 35, 45, 47, 50, 54, 57, 58, 60, 67, 68, 69, 70, 71, 75, 77, 79, 80}

        Dim parts As Integer = 4


        Dim result As IEnumerable(Of IEnumerable(Of Integer)) =
    From index As Integer
    In Enumerable.Range(0, CInt(Math.Ceiling(collection.Count() / parts)))
    Select collection.Skip(index * parts).Take(parts)

        Dim dinosaurs As New List(Of Integer)(parts)

        ListBox5.Items.AddRange(dinosaurs.Cast(Of Object).ToArray)



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

Eleкtro

Tienes la colección estática y principal, con nombre 'mainCol'.

Código (vbnet) [Seleccionar]
       ' La colección principal.
       Dim mainCol As IEnumerable(Of Integer) =
           {
               1, 2, 3, 4,
               5, 6, 10, 15,
               20, 22, 24, 25,
               30, 35, 45, 47,
               50, 54, 57, 58,
               60, 67, 68, 69,
               70, 71, 75, 77,
               79, 80
           }


Tienes la colección principal, dividida en una colección que contiene colecciones de 4 elementos (total: 8 sub-colecciones), con nombre 'splittedCols'.

Código (vbnet) [Seleccionar]
       ' La colección principal, dividida en una colección que contiene colecciones de 4 elementos (total: 8 colecciones).
       Dim parts As Integer = 4
       Dim splittedCols As IEnumerable(Of IEnumerable(Of Integer)) =
           From index As Integer In Enumerable.Range(0, CInt(Math.Ceiling(mainCol.Count() / parts)))
           Select mainCol.Skip(index * parts).Take(parts)


Y ahora, ¿que estás intentando hacer, unirla de nuevo?.

(Esto sería una forma rebuscada y poco optimizada, no se me ocurre nada mejor ahora mismo usando LINQ, pero puedes optimizarlo usando un FOR corriente de toda la vida, no ForEach)
Código (vbnet) [Seleccionar]
       ' Las 8 colecciones de 4 elementos cada una, unidas en una sola colección:
       Dim joinedCol As IEnumerable(Of Integer) = {}
       splittedCols.ToList.ForEach(Sub(col As IEnumerable(Of Integer))
                                       joinedCol = joinedCol.Concat(col)
                                   End Sub)


Código (vbnet) [Seleccionar]
ListBox1.Items.AddRange(joinedCol.Cast(Of Object)().ToArray)

PD: Intenta ser específico.

Saludos!








luis456

Cita de: Eleкtro en  8 Marzo 2015, 10:35 AM
Tienes la colección estática y principal, con nombre 'mainCol'.

Código (vbnet) [Seleccionar]
       ' La colección principal.
       Dim mainCol As IEnumerable(Of Integer) =
           {
               1, 2, 3, 4,
               5, 6, 10, 15,
               20, 22, 24, 25,
               30, 35, 45, 47,
               50, 54, 57, 58,
               60, 67, 68, 69,
               70, 71, 75, 77,
               79, 80
           }


Tienes la colección principal, dividida en una colección que contiene colecciones de 4 elementos (total: 8 sub-colecciones), con nombre 'splittedCols'.

Código (vbnet) [Seleccionar]
       ' La colección principal, dividida en una colección que contiene colecciones de 4 elementos (total: 8 colecciones).
       Dim parts As Integer = 4
       Dim splittedCols As IEnumerable(Of IEnumerable(Of Integer)) =
           From index As Integer In Enumerable.Range(0, CInt(Math.Ceiling(mainCol.Count() / parts)))
           Select mainCol.Skip(index * parts).Take(parts)


Y ahora, ¿que estás intentando hacer, unirla de nuevo?.

(Esto sería una forma rebuscada y poco optimizada, no se me ocurre nada mejor ahora mismo usando LINQ, pero puedes optimizarlo usando un FOR corriente de toda la vida, no ForEach)
Código (vbnet) [Seleccionar]
       ' Las 8 colecciones de 4 elementos cada una, unidas en una sola colección:
       Dim joinedCol As IEnumerable(Of Integer) = {}
       splittedCols.ToList.ForEach(Sub(col As IEnumerable(Of Integer))
                                       joinedCol = joinedCol.Concat(col)
                                   End Sub)


Código (vbnet) [Seleccionar]
ListBox1.Items.AddRange(joinedCol.Cast(Of Object)().ToArray)

PD: Intenta ser específico.

Saludos!


Funciona bien pero :

Pregunta  " Y ahora, ¿que estás intentando hacer, unirla de nuevo? " NO  jejej si todavía no he logrado hacer lo que en principio quería hacer, que era dividir la colección principal en variables con cuatro números  cada una para yo después con cada variable con los números asignados poder concatenar las que yo quiera entre ellas y mostrar ese resultado en un listbox

variable principal con números

Código (vbnet) [Seleccionar]
Dim mainCol As IEnumerable(Of Integer) =
            {
                1, 2, 3, 4,
                5, 6, 10, 15,
                20, 22, 24, 25,
                30, 35, 45, 47,
                50, 54, 57, 58,
                60, 67, 68, 69,
                70, 71, 75, 77,
                79, 80
            }




cada cuatro números se la asignamos a una variable


variable1 =1 2 3 4
variable2 = 5 6 10 15
variable3 = 20 22 24 24
etec etec


mostrar variable1  en  listbox1
mostrar variable2  en listbox2

Gracias  Elektro por tu ayuda y como me pediste mas especifico jejej



Luis
















Que tu sabiduria no sea motivo de Humillacion para los demas