我有几个字符串列表,如下所示,可能有几十个可选项:
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
,但实际上并没有递归。我不确定出了什么问题。有人能解释一下我的算法有什么问题吗?