如何将所有内容移动到阵列中的一个位置? C#

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何将所有内容移动到阵列中的一个位置? C#相关的知识,希望对你有一定的参考价值。

我正在尝试创建一个方法,将数组中第一个和最后一个字符之间的每个字符移动一个点。此外,第一个到最后一个字符必须“移动”到数组中的第二个点([1])。简而言之,我希望'abcdef'成为'aebcdf'。这就是我想出的:

                if (myArray.Length > 3)
            {
                char savechar = myArray[myArray.Length - 2];
                for (int t = 1; t < (myArray.Length - 2); t++)
                {
                    myArray[t++] = myArray[t];
                }
                myArray[1] = savechar;
            }

问题在于,它只是将第二个字符移动到最后,而不是将所有字符移动到一个位置。 (我知道为什么会这样,我只是不知道如何解决这个问题)有人帮忙吗?

答案
  1. 从结束开始而不是从开始开始,这样就不会复制已经更改过的字符。
  2. 我不认为您打算在循环中使用“++”。这会改变t的值而不是必需的。

这是结果代码:

if (myArray.Length > 3)
{
    char savechar = myArray[myArray.Length - 2];
    for (int t = myArray.Length - 2; t > 1; t--)
    {
        myArray[t] = myArray[t-1];
    }
    myArray[1] = savechar;
}
另一答案

这给出了所需的结果。请注意,由于我正在使用您的示例输入,因此没有长度检查。并没有努力使其高效;)

var list = "abcdef".ToCharArray().ToList();    
var item = list.ElementAt(list.Count - 2);
list.RemoveAt(list.Count - 2);
list.Insert(1, item);
var reordered = string.Join(string.Empty, list);
另一答案

这是我的看法:

for (int i = 1; i < input.Length - 1; i++)
{
  var temp = input[i];
  input[i] = input[input.Length - 2];
  input[input.Length - 2] = temp;
}
另一答案

使用Array.Copy:

if (myArray.Length > 3)
{
    char savechar = myArray[myArray.Length - 2];
    Array.Copy(myArray, 1, myArray, 2, myArray.Length - 3);
    myArray[1] = savechar;
}
另一答案

这只适用于字符串,但它有效:

    var text = "abcdef";
    var shifted = text.First() + text.Substring(text.Length - 2, 1) + text.Substring(0, text.Length - 2) + text.Last();
另一答案

这是一个通用的algorytm循环移位arrayshiftCount元素和跳跃skippedElementsarray的开始和结束:

var array = new char[] {'a', 'b', 'c', 'd', 'e', 'f'};

var skippedElements = 1;
var shiftCount = 1;
bool shiftLeft = true;
if (shiftLeft)
{
    // shift left
    Array.Reverse(array, skippedElements, shiftCount);
    Array.Reverse(array, skippedElements + shiftCount, array.Length - skippedElements * 2 - shiftCount);
    Array.Reverse(array, skippedElements, array.Length - skippedElements - shiftCount);

}
else
{
    // shift right
    Array.Reverse(array, skippedElements, array.Length - skippedElements * 2);
    Array.Reverse(array, skippedElements + shiftCount,  array.Length - skippedElements * 2 - shiftCount);
    Array.Reverse(array, skippedElements, shiftCount);
}

这是对Reversal algorithm for array rotation的修改。它适用于skippedElements > 0。它不需要额外的变量或内存。

另一答案

对于它的价值,如果这是一个生产系统,我可能会选择NPCampbell's Array.Copy solution,但为了演示(以及一点代码 - 高尔夫乐趣),这里是使用Linq的解决方案:

var n = myArray.Length - 1;
var newArray = myArray.Select((_, i) => myArray[i % n > 0 ? (i > 1 ? i : n) - 1 : i]).ToArray();

它不是最高性能的选项,绝对不是非常易读,但它的工作原理。

以上是关于如何将所有内容移动到阵列中的一个位置? C#的主要内容,如果未能解决你的问题,请参考以下文章

我将如何清除整个阵列?

如何将 c++/opengl 中的对象移动到新位置并擦除旧对象

如何使用 Visual Studio Tools for Git 将跟踪的文件移动到未跟踪的位置

将数组元素从一个数组位置移动到另一个位置

如何将 iPad 中的所有照片库图像放入阵列中

一个机器人在m×n大小的地图的左上角(起点,下图中的标记“start“的位置)。机器人每次向下或向右移动。机器人要到达地图的右下角。(终点,下图中的标记“Finish“的位置)。可以有多少种不(代码片