using System.Collections.Generic;
public static void Main()
IEnumerable<int[]> actual = Perm<int>.GetPermutations(Enumerable.Range(1,3).ToArray()).ToList();
Console.WriteLine(actual.Count() + " Permutations found:");
foreach(int[] permutation in actual)
Console.WriteLine(String.Join(", ", permutation));
IEnumerable<string[]> actual2 = Perm<string>.GetPermutations(new []{"A","B","C"}).ToList();
Console.WriteLine(actual2.Count() + " Permutations found:");
foreach(string[] permutation in actual2)
Console.WriteLine(String.Join(", ", permutation));
public static class Perm<T>
public static IEnumerable<T[]> GetPermutations(T[] items)
return GeneratePermutations(items, 0, items.Length - 1).ToList();
private static IEnumerable<T[]> GeneratePermutations(T[] permutationList, int startCount, int permutationCount)
if (startCount == permutationCount)
yield return permutationList;
for (int i = startCount; i <= permutationCount; i++)
Swap(permutationList, startCount, i);
IEnumerable<T[]> perms = GeneratePermutations((T[])permutationList.Clone(), startCount + 1, permutationCount).ToList();
foreach(T[] perm in perms)
Swap(permutationList, startCount, i);
public static void Swap(T[] list, int index1, int index2)
list[index1] = list[index2];