IndexOutOfRangeException

IndexOutOfRangeException

我有个问题。我试图实现之字形算法(Rail Fence)。
c# - 之字形,IndexOutOfRangeException-LMLPHP
我的代码如下:

    int n = 3;
    int j = 0;
    int charCounter = 0;
    char[,] chars = new char[n, input.Length]; //array to store chars

    while(charCounter <= input.Length) //char counter related to input string
    {
        if (charCounter >= input.Length)
            break;

        chars[nCounter++, j++] = input[charCounter++]; //goes n = 0 => 1 => 2 => 3
        if (nCounter == n)
            for (int i = nCounter; i >= 0; i--) //from this loop, i want to go n => 3 => 2 => 1 => 0 etc
            {
                if (charCounter >= input.Length)
                    break;
                if (nCounter == 0)
                    continue;
                chars[--nCounter, j++] = input[charCounter++];
            } //here i get an exception
    }

从上面的样本我得到一个Exception
System.IndexOutOfRangeException:“索引超出数组的边界。”
我的问题是,我的代码哪里有错误?
当我将嵌套for循环中的行从此处更改时:
chars[--nCounter, j++] = input[charCounter++];
对此:chars[nCounter--, j++] = input[charCounter++];
我没有任何异常,但我的char数组如下所示:
char[0,0] = input[0];
char[1,1] = input[1];
char[2,2] = input[2];
char[2,3] = input[3]; //that is wrong, should be [1,3]
char[1,4] = input[4];
//and so on..

应该是这样的:
char[0,0] = input[0];
char[1,1] = input[1];
char[2,2] = input[2];
char[1,3] = input[3]; //here the diffrence
char[0,4] = input[4];
//and so on..

感谢您对我的代码的任何改进建议!
编辑:
根据评论,我做了一些改进:
for(int i = 0; i <= input.Length; i++)
    chars[i % n, i] = input[i];

按行迭代很好,现在我需要解决列的问题

最佳答案

有一种方法可以生成一个从0增加到n的数字序列,然后再减少到0。
请考虑以下几点:
对于N=2,序列是{0,1,0,1 ..}
对于n=3,序列是{0,1,2,1,0,1,2 ..}
如果我们有这样一个序列,它的模是N+1,我们可以列举这些:
N=3时,{0,1,2,1}
n=4时,{0,1,2,3,2,1}
要生成此序列,我们必须:
从0计数到n。
然后从N-1数到0+1把两者结合在一起。

static int[] GenerateIncreasingDecreasing(int level)
{
    var tempRange = Enumerable.Range(0, level).ToArray();
    var indexMap = (tempRange.Length < 2) ?
                    tempRange :
                    tempRange.Concat(Enumerable.Range(1, level-2).Reverse());
    return indexMap.ToArray();
}

那么Crypt函数将是:
static string ZigZag(string input, int level)
{
    var indexMap = GenerateIncreasingDecreasing(level);
    var result =
            input.Select((c, i) => new {
                    Char = c,
                    Index = indexMap[i % ((level>2)?(level + 1):level)]
                })
                .GroupBy(x => x.Index)
                .OrderBy(g => g.Key)
                .SelectMany(x => x.Select(y => y.Char))
                .ToArray();

    return new string(result);
}

**:n

关于c# - 之字形,IndexOutOfRangeException,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55003316/

10-11 20:36