using System.Collections.Generic;
public static void Main()
Console.WriteLine("Hello World");
Outer outer1 = new Outer();
outer1.Inner.Add(new Inner { Name = "1.1" });
outer1.Inner.Add(new Inner { Name = "1.2" });
Outer outer2 = new Outer();
outer2.Inner.Add(new Inner { Name = "2.1" });
outer2.Inner.Add(new Inner { Name = "2.2" });
Outer outer3 = new Outer();
outer3.Inner.Add(new Inner { Name = "3.1" });
outer3.Inner.Add(new Inner { Name = "3.2" });
outer3.Inner.Add(new Inner { Name = "3.3" });
List<Outer> outer = new List<Outer> { outer1, outer2, outer3 };
var combinations = GetCombinations(outer);
foreach(var combination in combinations)
Console.WriteLine(string.Join(" ", combination.Select(x => x.Name)));
public static IEnumerable<Inner[]> GetCombinations(List<Outer> input)
int[] factors = new int[input.Count + 1];
factors[factors.Length - 1] = 1;
for(int i = factors.Length - 2; i >= 0; i--)
factors[i] = factors[i+1] * input[i].Inner.Count;
for(int j = 0; j < max; j++)
Inner[] result = new Inner[input.Count];
for(int i = 0; i < input.Count; i++)
result[i] = input[i].Inner[j / factors[i+1] % input[i].Inner.Count];
public string Name {get;set;}
public List<Inner> Inner {get;set;} = new List<Inner>();
public string Name {get;set;}