如果您只打算执行此操作一次,那么选择就不是很多。由
Monroe的答案提供的代码应该可以胜任。
byte[] newValues = new byte[values.Length + 1];
newValues[0] = 0x00;
Array.Copy(values, 0, newValues, 1, values.Length);
如果您需要执行此操作多次,则有更多选择。然而,将数据添加到数组的开头并不是一种高效的操作,因此您可以选择使用替代数据结构。
LinkedList
可以有效地在开头添加数据,但对于大多数任务来说它的效率较低,因为它涉及很多内存分配/释放并且还会失去内存局部性,因此这可能不是一个好的选择。
双端队列(也称为 deque)是非常适合您的一种数据结构。您可以有效地添加到开头或结尾,并且可以有效地访问结构中的任何位置的数据(但是您不能有效地在其他位置插入)。主要问题在于 .NET 没有提供 deque 的实现。您需要查找具有实现的第三方库。
通过跟踪“我需要添加的数据”(使用 List/Queue 等),等待尽可能长的时间来实际添加数据,以便尽量减少创建新数组的次数,并限制现有元素的复制次数,从而节省大量拷贝开销。
您还可以考虑调整结构,使其添加到末尾而不是开头(即使您知道以后需要将其反转)。如果您在短时间内经常添加,则将数据存储在
List
中(可以有效地添加到
end),并添加到末尾可能是值得的。根据您的需求,甚至可以制作一个类作为 List 的包装器,并隐藏它被反转的事实。您可以创建一个索引器将
i
映射到
Count-i
等,以便从外部看起来,尽管内部的
List
实际上将数据反向存储,但似乎正常存储数据。