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.
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
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:
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!