Объединение списков по определенному алгоритму

Есть несколько списков List<string>. Колл-во списков может быть разным.

Примерная архитектура списков:

введите сюда описание изображения

Нужно сгруппировать списки таким образом, чтобы получить единый список по такому алгоритму без рекурсии и желательно без Linq:

Item1-Item2-Item3-Item4-Item5
Item1-Item2-Item3-Item4-Item55
Item1-Item2-Item3-Item4-Item555

Item1-Item2-Item3-Item44-Item5
Item1-Item2-Item3-Item44-Item55
Item1-Item2-Item3-Item44-Item555

Item1-Item22-Item3-Item4-Item5
Item1-Item22-Item3-Item4-Item55
Item1-Item22-Item3-Item4-Item555

Item1-Item22-Item3-Item44-Item5
Item1-Item22-Item3-Item44-Item55
Item1-Item22-Item3-Item44-Item555

Item1-Item222-Item3-Item4-Item5
Item1-Item222-Item3-Item4-Item55
Item1-Item222-Item3-Item4-Item555

Item1-Item222-Item3-Item44-Item5
Item1-Item222-Item3-Item44-Item55
Item1-Item222-Item3-Item44-Item555

Item11-Item2-Item3-Item4-Item5
Item11-Item2-Item3-Item4-Item55
Item11-Item2-Item3-Item4-Item555

Item11-Item2-Item3-Item44-Item5
Item11-Item2-Item3-Item44-Item55
Item11-Item2-Item3-Item44-Item555

Item11-Item22-Item3-Item4-Item5
Item11-Item22-Item3-Item4-Item55
Item11-Item22-Item3-Item4-Item555

Item11-Item22-Item3-Item44-Item5
Item11-Item22-Item3-Item44-Item55
Item11-Item22-Item3-Item44-Item555

Item11-Item222-Item3-Item4-Item5
Item11-Item222-Item3-Item4-Item55
Item11-Item222-Item3-Item4-Item555

Item11-Item222-Item3-Item44-Item5
Item11-Item222-Item3-Item44-Item55
Item11-Item222-Item3-Item44-Item555

Подскажите реализацию или хоть с какой стороны подойти к задаче.


Ответы (1 шт):

Автор решения: EzikBro

Ежели рекурсия вам неугодна, то адекватным является такой вариант:

List<List<string>> vars = new List<List<string>> {
                new List<string> { "1", "11" },
                new List<string> { "2", "22", "222" },
                new List<string> { "3" },
                new List<string> { "4", "44" },
                new List<string> { "5", "55", "555" }
            };

List<int> varsSize = new List<int>(vars.Count);
int countOfCombinations = 1;
for (int i = 0; i < vars.Count; i++)
{
    varsSize.Add(vars[i].Count);
    countOfCombinations *= vars[i].Count;
}

List<List<string>> result = new List<List<string>>();
for (int comb = 0; comb < countOfCombinations; comb++)
{
    int tmp = comb;
    List<string> list = new List<string>();
    for (int i = vars.Count - 1; i >= 0; i--)
    {
        list.Add(vars[i][tmp % varsSize[i]]);
        tmp /= varsSize[i];
    }
    list.Reverse();
    result.Add(list);
}

foreach (List<string> comb in result)
{
    Console.WriteLine(String.Join("-", comb));
}

Это работает по принципу смешанной позиционной системы счисления, где для каждого разряда задано количество используемых в нем цифр.

→ Ссылка