下面是一些代码,将你想要做什么。完整的解释如下,但总之它需要的事实,一旦你做了给定长度的所有字母,你做了之后是整个序列再然后是B,然后再对整个序列的优势,等
private IEnumerable<string> EnumerateLetters()
{
int count = 1;
while (true)
{
foreach(var letters in EnumerateLetters(count))
{
yield return letters;
}
count++;
}
}
private IEnumerable<string> EnumerateLetters(int count)
{
if (count==0)
{
yield return String.Empty;
}
else
{
char letter = 'A';
while(letter<='Z')
{
foreach(var letters in EnumerateLetters(count-1))
{
yield return letter+letters;
}
letter++;
}
}
}
有两种方法。第一个是你打电话的那个,并且会产生一个无限的字母序列。第二个是递归魔术。
第一个很简单。它会计算出我们有多少个字母,用这个数字调用第二个方法,然后通过它们枚举返回它们。一旦它完成了所有的一个尺寸,它增加了计数和循环。
第二种方法是做魔术的方法。它会计算生成的字符串中的字母数。如果计数为零,则返回空字符串并中断。
如果计数超过一个,它将循环遍历字母A到Z,并且对于每个字母它会将它比序列短一些的顺序追加到A.然后对于B等等。
然后这将继续无限期地继续。
该序列将无限期地持续生成。因为它使用递归,所以如果你的字符串变得太长,但是在字符串中的每个字母的递归的一个级别,你将需要在很长的字符串之前起动,然后你需要担心它(我怀疑你是否在循环中走了那么远,你会首先遇到其他问题)。
另一个关键点(如果您不知道)是yield return使用延迟执行,因此它会根据需要在序列中生成每个新元素,因此它只会生成尽可能多的项目。如果你迭代五次,它只会产生A-E,并且不会浪费任何时间去思考接下来会发生什么。
不幸的是,这意味着我需要知道我需要多少嵌套for循环。它可能是100个循环,实际上嵌套太多了。 –
@Dave Gorden在开始之前,你知道你想要的循环数量吗? –
否迭代次数未知。 –