У меня есть несколько списков строк, например, из возможного списка из нескольких десятков:
1: { "A", "B", "C" }
2: { "1", "2", "3" }
3: { "D", "E", "F" }
Эти три были выбраны только в качестве примера, и пользователь может выбрать из нескольких десятков похожих списков с различнымиколичество элементов.Для другого примера это также совершенно правильный выбор для пользователя:
25: { } // empty
4: { "%", "!", "$", "@" }
16: { "I", "a", "b", "Y" }
8: { ")", "z", "!", "8" }
Что я хочу сделать, это получить каждую возможную комбинацию строк, сохраняя при этом «порядок» списков.Другими словами, предполагая, что мы смотрим на первый список, первая комбинация будет A1D
, затем A1E
, затем A1F
, затем B1D
, затем B1E
, и так далее, и так далее.Пока что я написал этот рекурсивный алгоритм:
public void Tester()
{
var 2dList = new List { list1, list2, list3 };
var answer = ReturnString(2dList).ToList();
answer.ForEach(Console.WriteLine);
}
public IEnumerable<string> ReturnString(List<List<string>> list)
{
if (!list.Any())
{
yield return null;
}
else
{
// for each letter in the top-most list...
foreach (var letter in list.First())
{
// get the remaining lists minus the first one
var nextList = list.Where(x => x != list.First()).ToList();
// get the letter and recurse down to find the next
yield return letter + ReturnString(nextList);
}
}
}
Однако взамен я получаю следующее:
AStringGeneration.StringGenerator+<ReturnString>d__11
BStringGeneration.StringGenerator+<ReturnString>d__11
CStringGeneration.StringGenerator+<ReturnString>d__11
StringGeneration
- это имя класса, ReturnString
находится внутри. Когда я ставлю точку останова на строке yield return letter + ...
, кажется, что она перебирает A
, B
и C
, но фактически не рекурсивно.Я не уверен, что здесь происходит.Кто-нибудь может объяснить, что не так с моим алгоритмом?