C#迭代一个不断增长的多维数组

标签 c# arrays

假设我想从 A 迭代到 Z。我们将使用 ForeachFor 循环。在达到 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/

相关文章:

java - 将字符串数组中的元素添加到defaultlistmodel中

c - 用C语言编写简单的字符表

arrays - 为什么 MATLAB 对结构数组赋值中的字段顺序敏感?

javascript - Chrome DevTools - 数组长度不一致

C# - 使用互联网上的大量图像填充 ImageList

c# - 排列/测量问题 - WPF 中的布局是否损坏?

c# - 当我尝试在 C# 中转义双引号时,我得到多个而不是一个

arrays - 位图索引搜索结果数组 : finding the indices of nonzero elements in constant time?

c# - Multi-Tenancy 应用程序中的IdentityRole

c# - 如何检查列表中的所有元素是否不同