C# 扩展阵列的最快方法

C# 扩展阵列的最快方法,c#,arrays,c#-4.0,C#,Arrays,C# 4.0,我正在寻找扩展阵列的最快方法。 无论是长度+1还是长度+x,它都必须是最快的方式 以下是一个例子: var arr = new int [200]; for(int = 0; i < 200; i++) arr[i] = i; 如何使用性能方面最快的方法将arr2放置在arr中 结果应该是这样的 0,1,2,3,4….20,999,999,999,999,999,21,22,23,24….199创建一个您想要的新数组,然后使用静态数组。Copy方法将原始数组复制到新数组中 你不能“

我正在寻找扩展阵列的最快方法。 无论是长度+1还是长度+x,它都必须是最快的方式

以下是一个例子:

var arr = new int [200];
for(int = 0; i < 200; i++)
   arr[i] = i;
如何使用性能方面最快的方法将arr2放置在arr中

结果应该是这样的
0,1,2,3,4….20,999,999,999,999,999,21,22,23,24….199

创建一个您想要的新数组,然后使用静态
数组。Copy
方法将原始数组复制到新数组中

你不能“扩展”一个数组,你只能创建一个更大的数组并将原始数组复制到其中


也可以考虑使用<代码>列表或 LIKEDLIST//COD>而不是数组,除非您需要对内存中的内容进行非常细粒度的控制。< /P> < P>创建一个新的数组,它是您想要的大小,然后使用static <代码>数组。 你不能“扩展”一个数组,你只能创建一个更大的数组并将原始数组复制到其中


也可以考虑使用<代码>列表或 LIKEDList 而不是数组,除非您需要对内存中的内容进行非常细粒度的控制。

使用列表要容易得多。但如果必须使用数组,则必须创建大小为205的新数组,并从两个源数组复制值,因为数组大小是恒定的。

使用列表要容易得多。但如果必须使用数组,则必须创建大小为205的新数组,并从两个源数组复制值,因为数组大小是恒定的。

如果您知道数组的长度,请将其标注为该长度

var ints  = new int[someFixedLength];
如果你对长度有一个vauge的想法,使用一个通用列表

var ints = new List<int>(someVagueLength);
将所有
5
int
s从
arr2
复制到索引
20
21
<代码>24共
arr


没有比c#(目前)更快的方法了。

如果您知道数组将用多长时间将其尺寸标注到该长度

var ints  = new int[someFixedLength];
如果你对长度有一个vauge的想法,使用一个通用列表

var ints = new List<int>(someVagueLength);
将所有
5
int
s从
arr2
复制到索引
20
21
<代码>24共
arr


使用c#(目前)没有更快的方法可以做到这一点。

最好的办法是使用类似于
列表的东西,而不是数组。但如果必须使用数组:

int[] arr1 = new int[200];
// initialize array
int[] arr2 = new int[]{999, 999, 999, 999, 999};

int targetPos = 20;

// resizes the array, copying the items
Array.Resize(ref arr1, arr1.Length + arr2.Length);

// move the tail of the array down
Buffer.BlockCopy(arr1, 4*targetPos, arr1, 4*(targetPos+arr2.Length), 4*(arr1.Length - targetPos));

// copy arr2 to the proper position
Buffer.BlockCopy(arr2, 0, 4*arr1.targetPos, 4*arr2.Length);
像这样创建一个新数组并复制项目可能会更快

int[] newArray = new int[arr1.Length + arr2.Length];

// copy first part of original array
Buffer.BlockCopy(arr1, 0, newArray, 0, 4*targetPos);

// copy second array
Buffer.BlockCopy(arr2, 0, newArray, 4*targetPos, 4*arr2.Length);

// copy remainder of original array
Buffer.blockCopy(arr1, 4*targetPos, newArray, 4*(targetPos + arr2.Length), 4*(arr1.Length - targetPos));

// and replace the original array
arr1 = newArray;
哪个版本更快将取决于
targetPos
的位置。当
targetPos
较小时,第二个版本会更快。当
targetPos
较小时,第一个版本必须复制大量数据两次。第二个版本从未复制过它必须复制的内容


BlockCopy
使用起来有点痛苦,因为它需要字节偏移量,这就是代码中所有乘法都是4的原因。您最好在上面的第二个版本中使用。这将防止您必须将所有内容乘以4(有时会忘记)。

您最好使用类似于
列表的内容,而不是数组。但如果必须使用数组:

int[] arr1 = new int[200];
// initialize array
int[] arr2 = new int[]{999, 999, 999, 999, 999};

int targetPos = 20;

// resizes the array, copying the items
Array.Resize(ref arr1, arr1.Length + arr2.Length);

// move the tail of the array down
Buffer.BlockCopy(arr1, 4*targetPos, arr1, 4*(targetPos+arr2.Length), 4*(arr1.Length - targetPos));

// copy arr2 to the proper position
Buffer.BlockCopy(arr2, 0, 4*arr1.targetPos, 4*arr2.Length);
像这样创建一个新数组并复制项目可能会更快

int[] newArray = new int[arr1.Length + arr2.Length];

// copy first part of original array
Buffer.BlockCopy(arr1, 0, newArray, 0, 4*targetPos);

// copy second array
Buffer.BlockCopy(arr2, 0, newArray, 4*targetPos, 4*arr2.Length);

// copy remainder of original array
Buffer.blockCopy(arr1, 4*targetPos, newArray, 4*(targetPos + arr2.Length), 4*(arr1.Length - targetPos));

// and replace the original array
arr1 = newArray;
哪个版本更快将取决于
targetPos
的位置。当
targetPos
较小时,第二个版本会更快。当
targetPos
较小时,第一个版本必须复制大量数据两次。第二个版本从未复制过它必须复制的内容


BlockCopy
使用起来有点痛苦,因为它需要字节偏移量,这就是代码中所有乘法都是4的原因。您最好在上面的第二个版本中使用。这将防止您将所有内容乘以4(有时会忘记)。

这里给出了显示计时基准的答案:。如果将“插入数组”作为数组1和3,将要插入的数组作为数组2,则“级联三数组”示例直接应用。
请注意接受答案末尾的要点:创建速度更快的方法会产生访问速度较慢的数组(这就是为什么我问您是否关心创建速度或访问速度)。

此处给出了显示计时基准的答案:。如果将“插入数组”作为数组1和3,将要插入的数组作为数组2,则“级联三数组”示例直接应用。
请注意接受答案末尾的要点:创建速度更快的方法会产生访问速度较慢的数组(这就是为什么我问您是否关心创建速度或访问速度)。

使用System.Linq,您可以通过向数组添加一个新对象来扩展数组,方法如下所示

int[] intA = new int[] { 1, 2, 3 };
int intB = 4;

intA = intA.Union(new int[] { intB }).ToArray();
…或者您可以通过向数组中添加另一个项目数组来扩展该数组

int[] intA = new int[] { 1, 2, 3 };
int[] intB = new int[] { 4, 5, 6 };

intA = intA.Union(intB).ToArray();
…或者如果你不在乎复制品

int[] intA = new int[] { 1, 2, 3 };
int[] intB = new int[] { 4, 5, 6 };

intA = intA.Concat(intB).ToArray();

使用System.Linq,您可以通过向数组添加一个新对象来执行以下操作来扩展数组

int[] intA = new int[] { 1, 2, 3 };
int intB = 4;

intA = intA.Union(new int[] { intB }).ToArray();
…或者您可以通过向数组中添加另一个项目数组来扩展该数组

int[] intA = new int[] { 1, 2, 3 };
int[] intB = new int[] { 4, 5, 6 };

intA = intA.Union(intB).ToArray();
…或者如果你不在乎复制品

int[] intA = new int[] { 1, 2, 3 };
int[] intB = new int[] { 4, 5, 6 };

intA = intA.Concat(intB).ToArray();

它必须是数组吗?你能使用像List这样的泛型吗?当这个数组在生产中时,它能容纳多少项?200? 10000?很好的相关资源,所以这是“最快的”?“扩展”是指重新定尺寸吗?您是需要插入速度最快,还是需要后续访问?换句话说,您是要对数组进行更多的插入还是访问?最佳解决方案总是取决于“你正在做什么”。它必须是一个数组吗?你能使用像List这样的泛型吗?当这个数组在生产中时,它能容纳多少项?200? 10000?很好的相关资源,所以这是“最快的”?“扩展”是指重新定尺寸吗?您是需要插入速度最快,还是需要后续访问?换句话说-d