0

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

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

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

  • 这是一个正确的假设吗?
  • 有没有更好的办法?我知道 Buffer.BlockCopy。
4

3 回答 3

8

不,当您返回时,您将返回对刚刚创建的数组的引用。参考将被复制,但这太便宜了。

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

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

于 2013-11-08T20:34:07.040 回答
3

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

于 2013-11-08T20:34:07.893 回答
1

如果听起来您想使用 LINQ Take

return realArray.Take(numberOfItems);

注意:这适用于获取数组中的第一个到 N 个元素

于 2013-11-08T20:33:56.413 回答