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

163

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

假设我有以下数组:

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

现在,如果我给出数组a的起始索引和结束索引,它应该被复制到另一个数组中。

例如,如果我将起始索引设置为1,将结束索引设置为3,则元素2、3、4应该被复制到新数组中。

6个回答

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

9
现在有了可用的命名参数,您将不需要记录这5个参数中的任何一个。 - Hamish Grubijan
12
@Hamish 嗯,也许吧。个人认为,除非显式添加名称使代码显着更清晰,否则我不会添加明确的名称,而且我不确定(在这种情况下)参数名称本身是否能够实现这一点。 - Marc Gravell

19

请看此问题。LINQ的Take()和Skip()是最受欢迎的答案,以及Array.CopyTo()。

这里描述了一个据称更快的扩展方法


1
SO上又有一个问题得到了合适的回答:https://dev59.com/QnA65IYBdhLWcg3w-jum#3539065 - Manfred
2
请注意,在处理性能关键的情况下,LINQ并不理想。 - XD face me

6
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 数组中。

在从一个数组复制到另一个数组时,必须为你要复制到的另一个数组提供相同的数据类型。


3

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();
            }
        }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接