如何在C#中将数组的一部分复制到另一个数组?


144

如何将数组的一部分复制到另一个数组?

考虑我有

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

现在,如果我给出数组的开始索引和结束索引,a则应将其复制到另一个数组。

就像我将开始索引设为1并将结束索引设为3一样,元素2、3、4应该复制到新数组中。

Answers:


273
int[] b = new int[3];
Array.Copy(a, 1, b, 0, 3);
  • a =源数组
  • 1 =源数组中的起始索引
  • b =目标数组
  • 0 =目标数组中的起始索引
  • 3 =要复制的元素

7
使用现在可用的命名参数,您无需记录5个参数中的任何一个。
Hamish Grubijan 2012年

11
@好吧,也许吧。我个人不会添加显式名称,除非它可以使代码更加清晰明了,而且我不确定(在这种情况下)参数名称本身是否可以实现。
马克·格雷夫


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

int [] b= new int[a.length]; //New Array and the size of a which is 4

Array.Copy(a,b,a.length);

其中Array是具有方法Copy的类,该方法将数组的元素复制到b数组。

从一个阵列复制到另一个阵列时,必须向要复制的另一个阵列提供相同的数据类型。


1

注意:我发现此问题是在寻找如何调整现有阵列大小的答案中的步骤之一。

因此,我想在这里添加这些信息,以防万一其他人在寻找如何进行远程复制的问题,作为对调整数组大小的问题的部分答案。

对于任何发现此问题并寻找与我相同的人,这非常简单:

Array.Resize<T>(ref arrayVariable, newSize);

其中T是类型,即在其中声明arrayVariable的地方:

T[] arrayVariable;

该方法处理空检查,以及newSize == oldSize不起作用,并且当然静默处理其中一个数组比另一个数组长的情况。

有关更多信息,请参见MSDN文章


0

如果您想实现自己的Array.Copy方法。

泛型类型的静态方法。

 static void MyCopy<T>(T[] sourceArray, long sourceIndex, T[] destinationArray, long destinationIndex, long copyNoOfElements)
 {
  long totaltraversal = sourceIndex + copyNoOfElements;
  long sourceArrayLength = sourceArray.Length;

  //to check all array's length and its indices properties before copying
  CheckBoundaries(sourceArray, sourceIndex, destinationArray, copyNoOfElements, sourceArrayLength);
   for (long i = sourceIndex; i < totaltraversal; i++)
     {
      destinationArray[destinationIndex++] = sourceArray[i]; 
     } 
  }

边界方法的实现。

private static void CheckBoundaries<T>(T[] sourceArray, long sourceIndex, T[] destinationArray, long copyNoOfElements, long sourceArrayLength)
        {
            if (sourceIndex >= sourceArray.Length)
            {
                throw new IndexOutOfRangeException();
            }
            if (copyNoOfElements > sourceArrayLength)
            {
                throw new IndexOutOfRangeException();
            }
            if (destinationArray.Length < copyNoOfElements)
            {
                throw new IndexOutOfRangeException();
            }
        }
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.