移动数组中的元素c#

Eri*_*itz 6 c# arrays

我有这个非常简单的数组,我希望能够移动一些项目.在c#中是否有任何内置工具来执行此操作?如果没有,你有任何建议如何做到这一点.

在例子中

var smallArray = new string[4];
smallArray[0] = "a";
smallArray[1] = "b";
smallArray[2] = "c";
smallArray[3] = "d";
Run Code Online (Sandbox Code Playgroud)

并且假设我想(以编程方式)移动索引2和0,创建

smallArray[0] = "c";
smallArray[1] = "a";
smallArray[2] = "b";
smallArray[3] = "d";
Run Code Online (Sandbox Code Playgroud)

谢谢.

Jon*_*eet 16

编辑:好的,现在你已经改变了这个例子,没有任何内置的东西 - 写起来实际上有点痛苦......你需要考虑将你移动它的情况"例如,你在哪里"向下"移动它.你想要单元测试,但我认为应该这样做......

public void ShiftElement<T>(this T[] array, int oldIndex, int newIndex)
{
    // TODO: Argument validation
    if (oldIndex == newIndex)
    {
        return; // No-op
    }
    T tmp = array[oldIndex];
    if (newIndex < oldIndex) 
    {
        // Need to move part of the array "up" to make room
        Array.Copy(array, newIndex, array, newIndex + 1, oldIndex - newIndex);
    }
    else
    {
        // Need to move part of the array "down" to fill the gap
        Array.Copy(array, oldIndex + 1, array, oldIndex, newIndex - oldIndex);
    }
    array[newIndex] = tmp;
}
Run Code Online (Sandbox Code Playgroud)

您应该考虑使用List<T>而不是数组,它允许您在特定索引处插入和删除.这两个操作比仅复制相关部分更昂贵,但它会更具可读性.


bal*_*dre 5

这是一个现有的问题:

C#数组移动项(非ArrayList/Generic List)

答案是:

void MoveWithinArray(Array array, int source, int dest)
{
  Object temp = array.GetValue(source);
  Array.Copy(array, dest, array, dest + 1, source - dest);
  array.SetValue(temp, dest);
}
Run Code Online (Sandbox Code Playgroud)

  • 当`source <dest`时,我认为这不会起作用 (2认同)