# List of combinations

After help with code

Need to list all combinations in groups of 3 where number cannot list more than once in the 3 number combo

Eg GOOD

1 - 2 - 3
1 - 2 - 4
1 - 2 - 5

1-1-1
1-1-2
1-1-3
1-2-1
etc
###### Who is Participating?
I wear a lot of hats...

"The solutions and answers provided on Experts Exchange have been extremely helpful to me over the last few years. I wear a lot of hats - Developer, Database Administrator, Help Desk, etc., so I know a lot of things but not a lot about one thing. Experts Exchange gives me answers from people who do know a lot about one thing, in a easy to use platform." -Todd S.

That would normally be done using three loops:
For loop1 as integer = 1 to 10
For loop2 as integer = loop1 + 1 to 10
For loop3 as integer = loop 2 + 1 to 10
Next
Next
Next
Author Commented:
Don't think that will work
Eg
2-1-3
Doesn't fit the formula
Author Commented:
Eg combos for 1 to 3
123
132
213
231
321
312
Ok...Something like this?
For loop1 as integer = 1 to 10
For loop2 as integer = 1 to 10
If loop1 = loop2 Then Continue For
For loop3 as integer = 1 to 10
If loop1 = loop3 OrElse loop2 = loop3 Then Continue For
Next
Next
Next
Commented:
Dim comb As String = ""

For a1 As Integer = 1 To 9
For a2 As Integer = 1 To 9
For a3 As Integer = 1 To 9
If a1 <> a2 AndAlso a1 <> a3 AndAlso a2 <> a3 Then
comb = a1.ToString() & "-" & a2.ToString() & "-" & a3.ToString()
' save each value as you wish here
End If

Next
Next
Next
DeveloperCommented:
Or you could use linq:
Module Module1
Sub Main()
Dim combinations = (From a As Integer In Enumerable.Range(1, 9) Let a1 As Integer = a _
From b As Integer In Enumerable.Range(1, 9) Let b1 As Integer = b _
From c As Integer In Enumerable.Range(1, 9) Let c1 As Integer = c _
Where Not a1.Equals(b1) AndAlso Not a1.Equals(c1) _
AndAlso Not b1.Equals(a1) AndAlso Not b1.Equals(c1) _
AndAlso Not c1.Equals(a1) AndAlso Not c1.Equals(b1) _
Select New Integer() {a1, b1, c1})
For Each combination In combinations
Console.WriteLine(String.Format("{0} - {1} - {2}", combination(0), combination(1), combination(2)))
Next
End Sub
End Module

Produces the following sample output:
-saige-
DeveloperCommented:
Modifying for the test case 1 to 3:
Module Module1
Sub Main()
Dim combinations = (From a As Integer In Enumerable.Range(1, 3) Let a1 As Integer = a _
From b As Integer In Enumerable.Range(1, 3) Let b1 As Integer = b _
From c As Integer In Enumerable.Range(1, 3) Let c1 As Integer = c _
Where Not a1.Equals(b1) AndAlso Not a1.Equals(c1) _
AndAlso Not b1.Equals(a1) AndAlso Not b1.Equals(c1) _
AndAlso Not c1.Equals(a1) AndAlso Not c1.Equals(b1) _
Select New Integer() {a1, b1, c1})
For Each combination In combinations
Console.WriteLine(String.Format("{0} - {1} - {2}", combination(0), combination(1), combination(2)))
Next
End Sub
End Module

Produces the following output:
-saige-
DeveloperCommented:
And for the coupe de gras, if you feel so inclined, you can create a method and add parameters so that you can provide your bookend integers, e.g. -
Module Module1
Private Function GetCombinations(ByVal start As Integer, ByVal [end] As Integer) As IEnumerable(Of Integer())
Dim combinations = (From a As Integer In Enumerable.Range(start, [end]) Let a1 As Integer = a _
From b As Integer In Enumerable.Range(start, [end]) Let b1 As Integer = b _
From c As Integer In Enumerable.Range(start, [end]) Let c1 As Integer = c _
Where Not a1.Equals(b1) AndAlso Not a1.Equals(c1) _
AndAlso Not b1.Equals(a1) AndAlso Not b1.Equals(c1) _
AndAlso Not c1.Equals(a1) AndAlso Not c1.Equals(b1) _
Select New Integer() {a1, b1, c1})
Return combinations
End Function

Sub Main()
For Each combination In GetCombinations(1, 3)
Console.WriteLine(String.Format("{0} - {1} - {2}", combination(0), combination(1), combination(2)))
Next
End Sub
End Module

-saige-
RetiredCommented:

Try this function out to see if it gives you what you are looking for.

public List<string> GeneratePermutations(string value)
{
if (value.Length > 1)
{
return (from character in value
from permutation in GeneratePermutations(value.Remove(value.IndexOf(character), 1))
select string.Format("{0} - {1}", character, permutation)).ToList();
}
else
{
return new List<string>() { value };
}
}

To call it you can do this,

List<string> results = GeneratePermutations("123");

or

List<string> results = GeneratePermutations(123.ToString());
DeveloperCommented:
Here is Fernando's method in VB.NET:
Module Module1
Private Function GetCombinations(ByVal start As Integer, ByVal [end] As Integer) As IEnumerable(Of Integer())
Dim combinations = (From a As Integer In Enumerable.Range(start, [end]) Let a1 As Integer = a _
From b As Integer In Enumerable.Range(start, [end]) Let b1 As Integer = b _
From c As Integer In Enumerable.Range(start, [end]) Let c1 As Integer = c _
Where Not a1.Equals(b1) AndAlso Not a1.Equals(c1) _
AndAlso Not b1.Equals(a1) AndAlso Not b1.Equals(c1) _
AndAlso Not c1.Equals(a1) AndAlso Not c1.Equals(b1) _
Select New Integer() {a1, b1, c1})
Return combinations
End Function

Private Function GeneratePermutations(ByVal value As String) As List(Of String)
If value.Length > 1 Then
Return (From character In value _
From permutation In GeneratePermutations(value.Remove(value.IndexOf(character), 1)) _
Select String.Format("{0} - {1}", character, permutation)).ToList()
Else
Return New List(Of String) From {value}
End If
End Function

Sub Main()
Console.WriteLine("Using get combinations...")
For Each combination In GetCombinations(1, 3)
Console.WriteLine(String.Format("{0} - {1} - {2}", combination(0), combination(1), combination(2)))
Next

Console.WriteLine()
Console.WriteLine("Using generate permutations...")
For Each permutation In GeneratePermutations("123")
Console.WriteLine(permutation)
Next
End Sub
End Module

Produces the following output:
BTW, nice use of recursion Fernando... ;)

-saige-
RetiredCommented:

As -saige- pointed out that my solution was in C# I resubmit it in my version of VB .Net.

Public Function GeneratePermutations(ByVal value As String) As List(Of String)
if value.Length > 1
Return (From character in value
from permutation in GeneratePermutations(value.Remove(value.IndexOf(character), 1))
Select String.Format("{0} - {1}", character, permutation)).ToList()
else
Return New List(Of String)() From { value }
End If
End Function

To call it you can do this,

Dim results As List(Of String) = GeneratePermutations("123");

or

Dim results As List(Of String) = GeneratePermutations(123.ToString());

@ -saige-, Thank you.
Author Commented:
@it saige
your code works great.  one adjustment what about if i had a rage of numbers and i want them in combinations of 3
ie user enters
5
9
7
1
3
8

output is all combination of these numbers in groups of 3
how you the code look for this
DeveloperCommented:
Thats simple enough.  Now you are dealing with a distinct *list* of integers and a *list* is enumerable, so in this case we would not use the Enumerable.Range but rather the list of distinct numbers itself, e.g. -
Module Module1
Private Function GetCombinations(ByVal numbers As IEnumerable(Of Integer)) As IEnumerable(Of Integer())
Dim combinations = (From a As Integer In numbers _
From b As Integer In numbers _
From c As Integer In numbers _
Where Not a.Equals(b) AndAlso Not a.Equals(c) _
AndAlso Not b.Equals(a) AndAlso Not b.Equals(c) _
AndAlso Not c.Equals(a) AndAlso Not c.Equals(b) _
Select New Integer() {a, b, c})
Return combinations
End Function

Sub Main()
Dim numbers As Integer() = {5, 9, 7, 1, 3, 8}
Console.WriteLine("Using distinct combinations...")
For Each combination In GetCombinations(numbers)
Console.WriteLine(String.Format("{0} - {1} - {2}", combination(0), combination(1), combination(2)))
Next
End Sub
End Module

Produces the following output:
Now we can simplify the original method by just calling the new GetCombinations method with the ranged enumerable:
Module Module1
Private Function GetCombinations(ByVal start As Integer, ByVal [end] As Integer) As IEnumerable(Of Integer())
Return GetCombinations(Enumerable.Range(start, [end]))
End Function

Private Function GetCombinations(ByVal numbers As IEnumerable(Of Integer)) As IEnumerable(Of Integer())
Dim combinations = (From a As Integer In numbers _
From b As Integer In numbers _
From c As Integer In numbers _
Where Not a.Equals(b) AndAlso Not a.Equals(c) _
AndAlso Not b.Equals(a) AndAlso Not b.Equals(c) _
AndAlso Not c.Equals(a) AndAlso Not c.Equals(b) _
Select New Integer() {a, b, c})
Return combinations
End Function

Sub Main()
Dim numbers As Integer() = {5, 9, 7, 1, 3, 8}
Console.WriteLine("Using get combinations...")
For Each combination In GetCombinations(1, 3)
Console.WriteLine(String.Format("{0} - {1} - {2}", combination(0), combination(1), combination(2)))
Next
Console.WriteLine("Press any key to continue...")

Console.WriteLine()
Console.WriteLine("Using distinct combinations...")
For Each combination In GetCombinations(numbers)
Console.WriteLine(String.Format("{0} - {1} - {2}", combination(0), combination(1), combination(2)))
Next
End Sub
End Module

-saige-

Experts Exchange Solution brought to you by