Объединение списков по определенному алгоритму
Есть несколько списков 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));
}
Это работает по принципу смешанной позиционной системы счисления, где для каждого разряда задано количество используемых в нем цифр.
