假设我想从 A 迭代到 Z。我们将使用 Foreach
或 For
循环。在达到 Z 之后,我想从 AA 迭代到 ZZ,所以它从 AA 开始,然后转到 AB、AC...AZ、BA、BC..BZ..ZA、ZB、ZZ。在这一点上,我们将移动到三个 chars
,然后是 4 个等等,直到一个未定义的点。
因为我们没有为数组定义长度,所以我们不能使用嵌套的 for
循环...所以
问题:如何做到这一点?
请注意,没有给出任何代码,因为我们都知道如何在数组上foreach
并嵌套 foreach
循环。
最佳答案
这里有一些代码可以满足您的需求。完整的解释如下,但总而言之,它利用了这样一个事实,即一旦你完成了给定长度的所有字母,你就可以先做 A,然后再做整个序列,然后再做 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++;
}
}
}
有两种方法。第一个是您调用的那个,它将生成无限的字母序列。第二个执行递归魔术。
第一个非常简单。它计算了我们有多少字母,用该计数调用第二个方法,然后通过它们枚举并返回它们。一旦它完成了一种尺寸的所有操作,它就会增加计数和循环。
第二种方法很神奇。它对生成的字符串中的字母数进行计数。如果计数为零,则返回一个空字符串并中断。
如果计数大于 1,它将遍历字母 A 到 Z,对于每个字母,它会将比它短一个的序列附加到 A。然后是 B,依此类推。
这将无限期地继续下去。
序列将无限期地生成。因为它使用递归,所以如果您的字母字符串变得太长,理论上可能会开始堆栈溢出,但是在字符串中每个字母的递归级别上,您需要得到非常长的字符串,然后才需要担心(我怀疑如果你在一个循环中走了那么远,你会首先遇到其他问题)。
另一个关键点(如果您不知道的话)是 yield return 使用延迟执行,因此它将根据需要生成序列中的每个新元素,因此它只会生成您要求的项目数。如果您迭代五次,它只会生成 A-E,而不会浪费任何时间思考接下来会发生什么。
关于C#迭代一个不断增长的多维数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42044210/