c# – 如何使用yield return和recursion获得每个字母组合?
作者:互联网
我有几个字符串列表,从几十个可能的列表:
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,但实际上并没有递归.我不确定这里发生了什么.任何人都可以解释我的算法有什么问题吗?
解决方法:
您需要枚举迭代器:
foreach(string s in ReturnString(...)) {
Console.WriteLine(s);
}
这也适用于每次迭代:
foreach(string tail in ReturnString(nextList))
yield return letter + tail;
另外,我怀疑你可以在这里用SelectMany做点什么.
标签:c,string-concatenation,recursion,yield-return 来源: https://codeday.me/bug/20190614/1236350.html