public static IEnumerable<IEnumerable<T>> Generate<T>(IEnumerable<T> list, int n)
{
if (n == 1) return list.Select(e => new[] { e });
var l = list.ToList();
return Generate(l, n - 1)
.SelectMany(t => l.Where(e => !t.Contains(e)),
(t1, t2) => t1.Concat(new[] { t2 }));
}
private static void PrintPermutation<T>(T[] arr)
{
for (var i = 1; i <= arr.Length; i++)
{
var enumerable = Generate(arr, i);
foreach (var list in enumerable)
{
Console.WriteLine(String.Join(", ", list));
}
}
}