using System.Collections.Generic;
private static IEnumerable<int[]> CombinationsRosettaWoRecursion(int m, int n)
int[] result = new int[m];
Stack<int> stack = new Stack<int>(m);
int index = stack.Count - 1;
result[index++] = value++;
if (index != m) continue;
yield return (int[])result.Clone();
public static IEnumerable<T[]> CombinationsRosettaWoRecursion<T>(T[] array, int m)
throw new ArgumentException("Array length can't be less than number of selected elements");
throw new ArgumentException("Number of selected elements can't be less than 1");
foreach (int[] j in CombinationsRosettaWoRecursion(m, array.Length))
for (int i = 0; i < m; i++)
static public void Main ()
int[] intArray = new int[]{ 2,4,8, 9};
var arrayLen = intArray.Length;
for(var i = arrayLen;i > 0; i--){
var result = CombinationsRosettaWoRecursion(intArray,i);
foreach(var line in result){
var dvalue = string.Join(",", line);
Console.WriteLine(dvalue);