Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在C中移动数组中的项?_C#_.net_Arrays - Fatal编程技术网

C# 如何在C中移动数组中的项?

C# 如何在C中移动数组中的项?,c#,.net,arrays,C#,.net,Arrays,假设我有一个字符串数组,如下所示: 1, 2, 3, 4, 5, 6, 7, 8 我想移动数组的元素,这样 第一个元素始终保持不变 只有剩下的元素会像这样移动。。。 数组中的最后一个元素成为第二个元素,并随着每次传递在数组中移动。 通过1:1,2,3,4,5,6,7,8 通过2:1,8,2,3,4,5,6,7 通过3:1,7,8,2,3,4,5,6 通过4:1,6,7,8,2,3,4,5 非常感谢您的帮助。因为这看起来像是家庭作业,我不打算为您解决它,但我有几点建议: 如果数据不在其他地方,请

假设我有一个字符串数组,如下所示:

1, 2, 3, 4, 5, 6, 7, 8
我想移动数组的元素,这样

第一个元素始终保持不变 只有剩下的元素会像这样移动。。。 数组中的最后一个元素成为第二个元素,并随着每次传递在数组中移动。 通过1:1,2,3,4,5,6,7,8 通过2:1,8,2,3,4,5,6,7 通过3:1,7,8,2,3,4,5,6 通过4:1,6,7,8,2,3,4,5


非常感谢您的帮助。

因为这看起来像是家庭作业,我不打算为您解决它,但我有几点建议:

如果数据不在其他地方,请记住不要覆盖数据。您需要一个临时变量。 尝试从头到尾遍历数组。这样的问题可能更简单,尽管可以从前面到后面进行。 请确保您的算法适用于任意长度的数组,而不仅仅是您的示例中给出的大小为8的数组。
因为这看起来像是家庭作业,所以我发布了一个不必要的复杂但非常时髦的LINQ解决方案:

int[] array = new int[] { 1, 2, 3, 4, 5, 6, 7, 8 };

int[] result = array.Take(1)
                    .Concat(array.Reverse().Take(1))
                    .Concat(array.Skip(1).Reverse().Skip(1).Reverse())
                    .ToArray();

在C中实现这一点的最快方法可能是使用Array.Copy。我对C语言中的指针知之甚少,所以可能有一种更快速的方法,可以避免数组边界检查等,但是下面的方法应该可以工作。它做了几个假设,不检查错误,但您可以修复它

void Shift<T>(T[] array) {
    T last = array[array.Length-1];
    Array.Copy(array, 1, array, 2, array.Length-2);
    array[1]=last;
}
编辑
或者,还有Buffer.BlockCopy,它根据执行较少的验证,但在内部以相同的方式复制块。

尽管听起来像其他人建议的家庭作业,但如果更改为列表,您可以通过以下操作获得所需内容

List<int> Nums2 = new List<int>();
for( int i = 1; i < 9; i++ )
   Nums2.Add(i);

for (int i = 1; i < 10; i++)
{
    Nums2.Insert( 1, Nums2[ Nums2.Count -1] );
    Nums2.RemoveAt(Nums2.Count -1);
}
定义如下:

public static class Extensions
{
    public static IEnumerable<T> Rotate<T>(this IEnumerable<T> enuml)
    {
        var count = enuml.Count();
        return enuml
            .Skip(count - 1)
            .Concat(enuml.Take(count - 1));
    }

    public static IEnumerable<T> SkipAndRotate<T>(this IEnumerable<T> enuml)
    {
        return enum
            .Take(1)
            .Concat(
                enuml.Skip(1).Rotate()
            );
    }
}

这里有一些重复的代码,您可能需要重构。当然,我还没有编译过这个,所以请注意

这与Josh Einstein的类似,但它将手动执行,并允许您指定在开始时保留多少元素

static void ShiftArray<T>(T[] array, int elementsToPreserve)
{
    T temp = array[array.Length - 1];

    for (int i = array.Length - 1; i > elementsToPreserve; i--)
    {
        array[i] = array[i - 1];
    }

    array[elementsToPreserve] = temp;
}

第一关:1 2 8 3 4 5 6 7

这一定是家庭作业。这上面应该有家庭作业标签。安迪,询问家庭作业问题一般都可以。看这个:你为什么说它必须是家庭作业?这是一个非常实用的问题。@Josh Einstein-因为它看起来很像家庭作业问题或面试问题,因为它是一个展示数组操作基本概念的玩具问题。如果你能改变数据结构,LinkedList可能是一个更好的选择。@Andy-你能提供你已经尝试过的代码吗。人们更容易更正代码,然后从头开始编写。此外,这表明你已经尝试了一些东西,而不仅仅是在寻找给你的答案。LinkedList会在更大的集合中提供更好的性能。我同意。。。更简单的链表-甚至双链接的逆转能力
static void ShiftArray<T>(T[] array, int elementsToPreserve)
{
    T temp = array[array.Length - 1];

    for (int i = array.Length - 1; i > elementsToPreserve; i--)
    {
        array[i] = array[i - 1];
    }

    array[elementsToPreserve] = temp;
}
int[] array = { 1, 2, 3, 4, 5, 6, 7, 8 };
ShiftArray(array, 2);