Mas problemas :( filtrar o eliminar registros iguales

Iniciado por luis456, 23 Marzo 2016, 11:45 AM

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

Lekim

#20
Chacho has repetido números:
{2, 6, 10, 11, 17, 20, 24, 34, 38, 39, 40, 41, 41, 42, 43, 44, 45, 46, 47, 50}

Quita ese número repetido (41)y verás que te salen 969 XD

Código (vbnet) [Seleccionar]
       Dim Elementos As IEnumerable(Of Integer) = {2, 6, 10, 11, 17, 20, 24, 34, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 50}
       Dim EleX As Integer = 0
       Dim EleX2 As Integer = 0
       ListBox1.Items.Clear() 'Limpia el ListBox
       For I1 As Integer = 0 To Elementos.Count - 1 : EleX += 1
           For I2 As Integer = EleX To Elementos.Count - 1
               For I3 As Integer = EleX To Elementos.Count - 1
                   If Elementos(I2) <> Elementos(I3) And Elementos(I3) > Elementos(I2) Then
                       ListBox1.Items.Add(String.Format("{0:00}, {1:00}, {2:00}", Elementos(I1), Elementos(I2), Elementos(I3)))
                   End If

               Next
           Next
       Next
       MessageBox.Show("Combinaciones: " & ListBox1.Items.Count)





      19!     
⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯ = 969
3!·(19 - 3)!


luis456

Cita de: Lekim en 25 Marzo 2016, 20:04 PM
Chacho has repetido números:
{2, 6, 10, 11, 17, 20, 24, 34, 38, 39, 40, 41, 41, 42, 43, 44, 45, 46, 47, 50}

Quita ese número repetido (41)y verás que te salen 969 XD

Código (vbnet) [Seleccionar]
       Dim Elementos As IEnumerable(Of Integer) = {2, 6, 10, 11, 17, 20, 24, 34, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 50}
       Dim EleX As Integer = 0
       Dim EleX2 As Integer = 0
       ListBox1.Items.Clear() 'Limpia el ListBox
       For I1 As Integer = 0 To Elementos.Count - 1 : EleX += 1
           For I2 As Integer = EleX To Elementos.Count - 1
               For I3 As Integer = EleX To Elementos.Count - 1
                   If Elementos(I2) <> Elementos(I3) And Elementos(I3) > Elementos(I2) Then
                       ListBox1.Items.Add(String.Format("{0:00}, {1:00}, {2:00}", Elementos(I1), Elementos(I2), Elementos(I3)))
                   End If

               Next
           Next
       Next
       MessageBox.Show("Combinaciones: " & ListBox1.Items.Count)





      19!     
⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯ = 969
3!·(19 - 3)!



Ya sabes las prisas jejjejeje pero si resta no ? y deja solo únicos, ya no veo de tanto estar pegado al monitor :(

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

Lekim

#22
Creo que lo tengo como querias.... jeje

espero te sirva "Al estilo Elektro" ajaja que lujo  :xD:


Código (vbnet) [Seleccionar]
Public Class Form1

   Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

       Dim intCol As IEnumerable(Of Integer) = {20, 24, 34, 44, 45}
       Dim pairsCol As IEnumerable(Of String) =
           From value1 As Integer In intCol
           From value2 As Integer In intCol
           Select String.Join(Environment.NewLine, (
                              From value3 As Integer In intCol
                              Where (value1 <> value2) AndAlso
                                    (value1 <> value3) AndAlso
                                    (value2 <> value3) AndAlso
                                    (value3 > value2) AndAlso
                                    (value2 > value1)
                              Select String.Format("{0:00}, {1:00}, {2:00}",
                                                   value1, value2, value3)))


       Dim ClearRep As New List(Of String)

       For Each pairs As String In pairsCol
           For Each line As String In pairs.Split({Environment.NewLine}, StringSplitOptions.RemoveEmptyEntries)
               ListBox1.Items.Add(line)
           Next line
       Next pairs

       MessageBox.Show(ListBox1.Items.Count)



   End Sub
End Class





Código (vbnet) [Seleccionar]
Public Class Form1

   Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

       Dim intCol As IEnumerable(Of Integer) = {2, 6, 10, 11, 17, 20, 24, 34, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 50}
       Dim pairsCol As IEnumerable(Of String) =
           From value1 As Integer In intCol
           From value2 As Integer In intCol
           Select String.Join(Environment.NewLine, (
                              From value3 As Integer In intCol
                              Where (value1 <> value2) AndAlso
                                    (value1 <> value3) AndAlso
                                    (value2 <> value3) AndAlso
                                    (value3 > value2) AndAlso
                                    (value2 > value1)
                              Select String.Format("{0:00}, {1:00}, {2:00}",
                                                   value1, value2, value3)))


       Dim ClearRep As New List(Of String)

       For Each pairs As String In pairsCol
           For Each line As String In pairs.Split({Environment.NewLine}, StringSplitOptions.RemoveEmptyEntries)
               ListBox1.Items.Add(line)
           Next line
       Next pairs

       MessageBox.Show(ListBox1.Items.Count)



   End Sub
End Class





Hace lo mismo que el mio, pero como insistias tanto en este sistema lo he machacado un poco hasta que di  con el problemas, pero vamos que hace lo mismo.

Eleкtro

#23
El mal llamado "Estilo Elektro" se denomina LINQ-to-Objects, es algo más expensivo que un FOR, pero más legible y manejable que un FOR.

Si le ofrezco soluciones basadas en LINQ, es por que supuestamente Luis en su día se puso a practicar con los 101 ejemplos de LINQ oficiales de la galería de código de Microsoft, por lo que está más acostumbrado a este estilo de sintaxis, lo cual, en mi opinión, le resultará de mucha utilidad, puesto que, lo bueno de LINQ, es su versatilidad con esa cantidad de útiles keywords disponibles para realizar típicas operaciones que nos tomarían más tiempo de escritura al traducirlas a un búcle For Range o For Each.

Saludos.








Lekim

#24
Cita de: Eleкtro en 25 Marzo 2016, 21:11 PM
El mal llamado "Estilo Elektro" se denomina LINQ-to-Objects, es algo más expensivo que un FOR, pero más legible y manejable que un FOR.

Si le ofrezco soluciones basadas en LINQ, es por que supuestamente Luis en su día se puso a practicar con los 101 ejemplos de LINQ oficiales de la galería de código de Microsoft, por lo que está más acostumbrado a este estilo de sintaxis, lo cual, en mi opinión, le resultará de mucha utilidad, puesto que, lo bueno de LINQ, es su versatilidad con esa cantidad de útiles keywords disponibles para realizar típicas operaciones que nos tomarían más tiempo de escritura al traducirlas a un búcle For Range o For Each.

Saludos.

Hola Elektro

No te lo tomes a ma, jeje.  Desconocía completamente que se pudiera hacer usando LINQ-to-Objects, es mas desconocía LINQ-to-Objects. Con eso te lo digo todo.

Pero... este sistema va como sobre raíles, es decir, genera todas las combianciones de forma sistemática. ¿Qué pasa si yo solo quiero un grupo al azar de todas las combinaciones posibles que te haría LINQ-to-Objects? .

Claro podrías pensar, genero todas, y luego cojo algunas al azar. Eso vale si son pocas pero ¿Y si son unas 14 millones como en el código que he hecho yo de la Primitiva y solo quiero X < 14 millones al azar? No se si se podría usar en dicho caso LINQ-to-Objects.

Al descubrir "el estilo Elektro" XD, he estado contemplando la posibilidad de usar LINQ-to-Objects, pero no se me ocurre como.

Si ves mi código unos comentarios más atrás, verás que se pueden modificar varios valores como NumCombinaciones y " For Index As Integer = 1 To 6"  o         Dim MisBolas() As String = {2, 6, 10, 11, 17, 20, 24, 34, 38, 39, 40}

Y no tengo que modificar código, ni condiciones para cambiar las combinaciones. Por ejemplo esto generaría combinaciones de la Primitiva pero solo con los números  {2, 6, 10, 11, 17, 20, 24, 34, 38, 39, 40}. Se podrían hacer un total de 462 combianciones. Pero el código sólo genera al azar  100. Que es lo que he establecido en  

  Dim NumCombinaciones As Integer = 100
(se puede cambiar 100 por 462 y las hace también..)

Código (vbnet) [Seleccionar]
Public Class Form1
   Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
       Dim ListaComb As New List(Of String)         '//Lista de combinaciones
       Dim NumCombinaciones As Integer = 100 '<---OJO EN ESTE CASO SOLO LO MAXÍMO SON 462
       Dim NewComb As String
       ListaComb.Clear()

       For B1 As Integer = 1 To NumCombinaciones
           While ListaComb.Count < NumCombinaciones
               NewComb = GetCombPrimitiva()
               ListaComb.Add(NewComb)
               ListaComb = ListaComb.Distinct.ToList
               Me.Text = "Combinaciones generadas: " & ListaComb.Count
               My.Application.DoEvents()
           End While

       Next B1
       ListaComb.Sort()
       ListBox1.Items.Clear()
       For Each Elem As String In ListaComb
           ListBox1.Items.Add(Elem)
       Next

   End Sub
   Public Function GetCombPrimitiva() As String
       Dim MisBolas() As String = {2, 6, 10, 11, 17, 20, 24, 34, 38, 39, 40}
       Dim Bombo As New List(Of Integer)           '//Bombo para meter las bolas
       Dim Fila As New List(Of Integer)            '//Fila virtual para poner las bolas en orden
       Dim Combinación As String = Nothing
       Dim NumRandom As New Random
       '//Llena el bombo
       For Index As Integer = 0 To MisBolas.Count - 1
           Bombo.Add(MisBolas(Index))
       Next

       '//Extrae las bolas
       For Index As Integer = 1 To 6
           '//Devuelve números del 0 a 48 (49 números, Bola(0): contiene 1, Bola(1): Bolcontiene 2 ...)
           Dim Bola As Integer = NumRandom.Next(0, Bombo.Count)
           '//Mete la bola en la "fila"
           Fila.Add(Bombo(Bola))
           '//Quita la bola obtenida del bombo
           Bombo.RemoveAt(Bola)
       Next
       Fila.Sort() 'Ordena la fila de bolas
       For Each Bola As Integer In Fila
           Combinación += String.Format("{0:00} ", Bola)
       Next
       Return Combinación
   End Function


End Class


Pero,  este código tiene un inconveniente. A medida que añade combinaciones a la lista tiene que comprobar que no ha salido antes, y en cuanto el número de combinaciones en la lísta más se acerque al máximo ( en este caso serían 462) más tarda en añadir una nueva combinación a la lista. Porque claro, el código no está pensado para hacer todas, sino una porción del total.

¿Cómo se podría hacer con LINQ-to-Objects? Sin tener que estar modificando las condiciones. Si añado un número más o menos, o dos más, etc. Hay que estar modificando el código. Además que no quiero todos, sino todos o una parte del total al azar. No se me ocurre como se podría aprovechar la ventaja de LINQ-to-Objects. ¿Alguna idea?


S2s

luis456

Cita de: Eleкtro en 25 Marzo 2016, 21:11 PM
El mal llamado "Estilo Elektro" se denomina LINQ-to-Objects, es algo más expensivo que un FOR, pero más legible y manejable que un FOR.

Si le ofrezco soluciones basadas en LINQ, es por que supuestamente Luis en su día se puso a practicar con los 101 ejemplos de LINQ oficiales de la galería de código de Microsoft, por lo que está más acostumbrado a este estilo de sintaxis, lo cual, en mi opinión, le resultará de mucha utilidad, puesto que, lo bueno de LINQ, es su versatilidad con esa cantidad de útiles keywords disponibles para realizar típicas operaciones que nos tomarían más tiempo de escritura al traducirlas a un búcle For Range o For Each.

Saludos.


El estilo Elektro jejej, bueno es el que mas cómodo se me hace ya que es cierto lo que dice el yo me acostumbre a linq y se me hace ahora un poco difícil mirar otros metodos
pero ambas son buenas ya que las de lekim son similares a Fox y tampoco es tan difícil
les agradezco a los dos por la ayuda, pero les recuerdo que cada programador lo hace a su manera generalmente pero lo mejor es compartir de todo esto  ;-)

Luis





Que tu sabiduria no sea motivo de Humillacion para los demas