C# 如果退出数组,则从另一侧输入

C# 如果退出数组,则从另一侧输入,c#,c++,math,C#,C++,Math,例如,如果我有1,2,3,4,5,6,7数组,我在第4个位置5,如果你必须将它移动到正确的4个位置,你应该在第1个位置2。负数也是一样,但你向左移动。我想需要whiletrue循环?假设I是索引,n是数组的大小。 对于正i,所需索引=i%n 对于负i,i%n返回负的余数,因此需要的索引是n+i%n 你可以用 int index(int i, int n) { return i%n < 0 ? n + (i%n) : i%n; } 您可以这样计算索引: var newIndex =

例如,如果我有1,2,3,4,5,6,7数组,我在第4个位置5,如果你必须将它移动到正确的4个位置,你应该在第1个位置2。负数也是一样,但你向左移动。我想需要whiletrue循环?

假设I是索引,n是数组的大小。 对于正i,所需索引=i%n 对于负i,i%n返回负的余数,因此需要的索引是n+i%n

你可以用

int index(int i, int n) {
   return i%n < 0 ? n + (i%n) : i%n;
}

您可以这样计算索引:

var newIndex = (index + 4) % 7;

因此,第四个位置变为4+4%7或1。

使用命名函数和可遵循的代码路径,而不是工作的巫毒一行程序,总是更清晰

    public void MyTest()
    {
        var testData = new[] { 1, 2, 3, 4, 5, 6, 7 };

        Assert.AreEqual(2, TraverseCircularArray(testData, 5, 3));
        Assert.AreEqual(6, TraverseCircularArray(testData, 2, -4));
    }

    private int TraverseCircularArray(int[] array, int currentIndex, int interval)
    {
        var i = array[currentIndex];

        if (currentIndex + interval < 0)
            i = array[array.Length + (interval + currentIndex)];
        else if (currentIndex + interval >= array.Length)
            i = array[currentIndex - interval - 1];
        else
            i = array[currentIndex + interval];

        return i;
    }

你能给我们提供你到目前为止尝试过的方法吗?制作一个返回索引的方法。对于像int indexint i,int n{return i%n;}这样的正数,您可以为您的容器覆盖[]操作符,并考虑@Valentin的建议。这里的目的不是给出答案代码,而是给他自己解决问题的建议。通过这种方式,提问者可以通过自己解决问题来进行稳健的学习。