【问题标题】:Moving element in array with C#用C#在数组中移动元素
【发布时间】:2012-06-05 15:19:01
【问题描述】:

有没有办法在数组中移动项目?例如:

int[] myArray = {1,2,3,4};

第二个元素变成最后一个:

int[] myArray = {1,3,4,2};

P.S.:不,这不是功课。我可以想到至少一种解决方案,但它需要相当困难的实现:

  • 首先我们将第二个元素保存到 Int
  • 然后我们从数组中删除这个元素
  • 然后我们在数组的最后添加新元素

任何其他(阅读 - 更容易)的方式来做到这一点?

【问题讨论】:

  • 交换元素不会做同样的事情吗?
  • 通过交换我们的意思是第二个元素成为最后一个,但最后一个成为第二个。我想移动第二个元素而不改变其他元素的顺序。 (如示例)。
  • 请注意,这里允许提出家庭作业问题,只要您遵循“家庭作业”标签说明中所述的规则(并将“家庭作业”标签添加到您的问题中) )。

标签: c# arrays element


【解决方案1】:

使用数组没有简单的方法来做到这一点。您必须遍历数组,将每个元素向上移动到正在移动的索引,然后在末尾重新插入该元素。你总是可以使用List<int> 来做这件事。

List<int> list = myArray.ToList();
int value = list[1];
list.RemoveAt(1);
list.Add(value);
myArray = list.ToArray();

【讨论】:

    【解决方案2】:

    使用List&lt;int&gt;。数组并不适合所有元素的这种运动。

    或者尝试交换最后一个和选择的元素,但它会弄乱顺序。

    【讨论】:

    • 请注意,如果您以后需要该数组,您只需调用List&lt;int&gt;.ToArray()
    【解决方案3】:

    如果数组总是固定大小,那么:

    myArray = new int[4] { myArray[0], myArray[2], myArray[3], myArray[1] };
    

    但如果它的大小是可变的,那么它会变得更棘手,最好先在列表中完成

    int lastElement = 0;
    List<int> newArray = new List<int>();
    for ( int index=0; index<myArray.Length; index++)
    {
         if ( index == 1 ) lastElement = myArray[index];
         else newArray.Add(myArray[index]);
    }
    newArray.Add(lastElement);
    myArray = newArray.ToArray();
    

    【讨论】:

      【解决方案4】:
         myArray = new List<int>(myArray.Where((x, i) => (i != 1))) 
                     { myArray[1] }.ToArray();
      

      【讨论】:

      • 感谢您的解决方案!我刚刚检查过它,它工作正常!但是,请注意,这种方法存在一些严重的性能问题。经过 100 万次迭代后,与 (array->list-> removeat->add) 方法(210ms vs 2+ 秒)相比,这种方法几乎慢了 10 倍。
      【解决方案5】:

      对于这种情况,您可以使用XOR swap

      [Test]
      public void TestSwap()
      {
          int[] myArray = { 1, 2, 3, 4 };
      
          Console.WriteLine(string.Join(", ", myArray));
      
          Swap(myArray, 1, 2);
          Swap(myArray, 2, 3);
      
          Console.WriteLine(string.Join(", ", myArray));
      }
      
      static void Swap(int[] vals, int x, int y)
      {
          vals[x] = vals[x] ^ vals[y];
          vals[y] = vals[y] ^ vals[x];
          vals[x] = vals[x] ^ vals[y];
      }
      

      【讨论】:

      • 您为什么要这样做?这实际上比使用临时变量要慢(如果值相同,也将不起作用)
      • @BrokenGlass:“有任何方法可以在数组中移动项目吗?”这是一种方式。
      • 不,你不是在移动元素——你是在交换它们,就像已经建议的那样
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-19
      • 1970-01-01
      • 2016-08-28
      • 1970-01-01
      相关资源
      最近更新 更多