返回数组的一部分

时间:2013-11-08 20:32:20

标签: c# arrays

我试图找到在C#中返回数组的一部分的最快方法 我目前的方式如下:

// .. set int moveCount ..
// .. set int[] childArray ..
int[] realArray = new int[moveCount];
Array.Copy(childArray, realArray, moveCount);
return realArray;

这是我在网上到处看到的方式,但是 我想知道数组现在是否会复制两次。一次因为我这样做,一次因为回来。

  • 这是正确的假设吗?。
  • 有更好的方法吗?我知道Buffer.BlockCopy。

3 个答案:

答案 0 :(得分:8)

不,当你返回时,你会将引用返回到你刚创建的数组。该参考文献将被复制,但这很便宜。

所有数组都是引用类型,即使数组的元素类型是值类型(因此int[]是引用类型,即使int是值类型)。

现在您仍然可以考虑返回ArraySegment<int>而不是int[] - 这样您就不会在数组中复制任何值。另一方面,如果原始数组被更改,那些更改将影响调用者看到的内容(同样调用者可以更改数组内容)。

答案 1 :(得分:3)

不,您的假设是错误的,您的return语句返回对创建的数组的引用。所以不,你没有创建返回的数组的两个副本。关于块复制的部分,我认为你的Array.Copy是最好的权衡。

答案 2 :(得分:1)

如果您想使用LINQ Take

return realArray.Take(numberOfItems);

注意:这适用于将数组中的第一个元素转换为N个元素