Combinaciones de tamaño N

Crea un método genérico que devuelva todas las combinaciones de tamaño n de una colección que ya está ordenada. Conserva el orden de entrada de los elementos dentro de cada combinación y devuelve las combinaciones en orden lexicográfico ascendente. Los elementos pueden ser números, cadenas de texto o cualquier otro tipo de elemento compatible con el código inicial proporcionado.

Ejemplos

Program.Combo(new int[] { 1, 2, 3, 4 }, 1) ➞ new int[][] { new int[] { 1 }, new int[] { 2 }, new int[] { 3 }, new int[] { 4 } }

Program.Combo(new int[] { 1, 2, 3, 4 }, 2) ➞ new int[][] { new int[] { 1, 2 }, new int[] { 1, 3 }, new int[] { 1, 4 }, new int[] { 2, 3 }, new int[] { 2, 4 }, new int[] { 3, 4 } }

Program.Combo(new int[] { 1, 2, 3, 4 }, 5) ➞ new int[][] {  }

Program.Combo(new int[] { 1, 2, 3, 4 }, 0) ➞ new int[][] { new int[] {  } }

Notas

  • El orden lexicográfico compara primero los primeros elementos: [1, 2] aparece antes que [2, 4]. Cuando los primeros elementos coinciden, se comparan los segundos: [1, 2] aparece antes que [1, 3], y así sucesivamente.
  • Devuelve una colección externa vacía si n supera la longitud de la entrada.
  • Devuelve una combinación vacía si n es 0, porque existe exactamente una combinación de longitud cero.