У меня есть несколько списков таких строк из возможного списка из нескольких десятков:
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
, но на самом деле не повторяется. Я не уверен, что здесь происходит. Кто-нибудь может объяснить, что не так с моим алгоритмом?