编程语言
首页 > 编程语言> > c# – 如何使用yield return和recursion获得每个字母组合?

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