Combinaciones con subrangos

Iniciado por luis456, 24 Noviembre 2014, 19:46 PM

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

luis456

Bueno otra ves con mis rollos de combinaciones tengo este codigo que me hace estas combinaciones y mi idea es como hacer que solo aparescan combinaciones con dos números de cada subrango .los números a combinar no son fijos y varian de cantidades ( entre 20 y 80 numeros) dependiendo de otra funcion.


los subrangos serian:
01 al 09
10 al 19
20 al 29
30 al 39
40 al 49
50 al 59
60 al 69
70 al 79
80 al 89
90 al 99


Ahora este código me los combina de esta forma

01, 02, 05, 07, 08, 15, 17, 18
01, 02, 05, 07, 08, 15, 17, 45
01, 02, 05, 07, 08, 12, 15, 17
01, 02, 05, 07, 08, 15, 17, 22
01, 02, 05, 07, 08, 15, 17, 23
01, 02, 05, 07, 08, 15, 17, 27
01, 02, 05, 07, 08, 15, 17, 28
01, 02, 05, 07, 08, 15, 17, 33
01, 02, 05, 07, 08, 15, 17, 34


Pero los necesito de esta forma

01 05 10 15 20 25 35 38
07 09 11 16 24 26 70 78
10 19 35 38 45 49 80 88

como verán por cada combinación solo hay dos de cada subrango y haci llenar todas las combinaciones posibles con los números que contiene la variable.


Código (vbnet) [Seleccionar]
Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click

       Dim combinations As New List(Of List(Of Integer))
       Dim length As Integer = 7
       Dim skipStart As Integer = 0
       Do Until skipStart = (constantValues.Count - length)

           Dim values As List(Of Integer) = constantValues.GetRange(skipStart, length)
           Dim count As Integer = 0

           Do Until count = (constantValues.Count - length - skipStart)

               Dim list As List(Of Integer) = values.Concat(constantValues.Skip(skipStart + length + count).Take(1)).ToList
               list.Sort()
               combinations.Add(list)

               '  Debug.WriteLine(String.Join(", ", values.Concat(constantValues.Skip(skipStart + length + count).Take(1)).ToArray))

               count += 1

           Loop ' count = (constantValues.Count - length)

           skipStart += 1


       Loop ' skipStart = (constantValues.Count - length)
       combinations.RemoveAll(Function(list As List(Of Integer)) list.First = 0)

       combinations.ForEach(Sub(combination As List(Of Integer))
                                ListBox2.Items.Add(String.Join(", ", From value As Integer In combination
                                                                     Select If(value.ToString.Length = 1I,
                                                                               value.ToString.Insert(0I, "0"c),
                                                                               value.ToString)))

                               '  Label11.Text = combinations.Count.ToString()

                            End Sub)


      '  Button4.Enabled = False

   End Sub  



saludos
Luis







Que tu sabiduria no sea motivo de Humillacion para los demas

Eleкtro

#1
Cuantas veces habré repetido que puedes utilizar LINQ para hacer practicamente lo que quieras y como quieras con una colección genérica sin apenas esfuerzo...

Ejemplo de cómo agrupar esos valores numéricos por rangos (mientras no hayan números mayores que 100) y elegir los 2 primeros valores de cada rango agrupado:
Código (vbnet) [Seleccionar]
Public Class Form1

   Public Class GroupOfTwo
       Public First As Integer
       Public Last As Integer
   End Class

   Private Shadows Sub Shown() Handles MyBase.Shown

       Dim constantValues As New List(Of Integer) From
          {
              1I, 9I, 11, 12, 14, 16, 20, 24, 35, 38,
              40, 44, 50, 58, 59, 60, 68, 70, 77, 80,
              81, 88, 90, 92, 99
          }

       Dim groups As IEnumerable(Of GroupOfTwo) =
           From value As Integer In constantValues
           Group By value.ToString("00").First Into Group
           Select New GroupOfTwo With
                      {
                        .First = Group(0),
                        .Last = Group(1)
                      }

       Dim sb As New System.Text.StringBuilder
       For Each group As GroupOfTwo In groups
           sb.AppendLine(String.Format("{0}, {1}", group.First, group.Last))
       Next group

       MessageBox.Show(sb.ToString, "Grupos de dos", MessageBoxButtons.OK)

   End Sub

End Class


Saludos!