在C#中将字节数组复制到另一个字节数组

42

有两个字节数组,它们分别填充有不同的值。

byte[] Array1 = new byte[5];
byte[] Array2 = new byte[5];

那么,我需要Array1的值与Array2完全相同。

通过输入Array1 = Array2,我只会设置引用,这不会复制值。

可能的解决方案是什么?

编辑:

所有答案都很好,所有解决方案都可行。第一个解决方案的代码在我的特定情况下外观描述更加详细。

Array1 = Array2.ToArray();

以及

Array1.CopyTo(Array2, 0);

还有

Buffer.BlockCopy(Array2, 0, Array1, 0, 5);


7
了解 Buffer.BlockCopy 方法。 - Dour High Arch
不,第一个数组应该是第二个数组的精确副本。但它不应以任何方式与其链接。不应该是一个指针。 - acoder
3
两个答案都很好,两个解决方案都可行。还提到了第一条评论中的Buffer.BlockCopy,任何Array.Copy重载以及Array.Clone也都可以使用。 - Ivan Stoev
2个回答

54

Linq提供的一种解决方案...

Array1 = Array2.ToArray();

编辑:在使用此 Linq 调用之前,您无需为 Array1 分配空间。 对 Array1 的分配是在 ToArray() 中完成的。 更完整的示例如下所示。

byte[] Array2 = new byte[5];
// set values for Array2
byte[] Array1 = Array2.ToArray();

4
这是一个相当不错的解决方案,但由于原帖已经分配了目标数组并且说过,“我只是设置引用,不复制值”,因此我认为在您的回答中指出您正在创建新的引用而不是将值复制到预先分配的数组中是明智的。 - Enigmativity
2
好的,我认为OP中的语句“通过键入Array1 = Array2,我只设置了引用,而不是复制值”是想说数组引用被复制了,而值本身没有被复制。这也似乎是他后来评论中的情况:“但它不应该以任何方式与它链接”,我认为这是想说Array1 [0] =(byte)1Array2中的值不会产生任何影响。 - Frank Bryce
2
是的,我同意。这就是为什么我认为你的答案是一个相当简洁的解决方案。我只是认为原帖作者可能需要更深入地了解机制。 - Enigmativity
据我所理解,Array2.ToArray()会分配一个新的数组。如果多次执行Array1 = Array2.ToArray();,比如在一个for循环中,这些分配的数组会一直存在于内存中吗? - acoder
@acoder C#有一个垃圾回收系统,因此如果您没有对已分配内存的更多引用,则值将被清除。我不建议在循环中分配新内存,然后快速忽略这些值。 - Frank Bryce

48

1
六年后,我觉得值得指出的是应该是 Array2.CopyTo(Array1, 0)。原有的代码会按照相反的方向进行复制。 - Kemp
@Kemp,是的,已经修复了。 - Qwertiy
更多的细节会更有帮助。整数参数是从哪个元素开始复制的。微软文档一如既往地难以阅读。我相信Array1需要预先分配,很快我就会找出来 :-) - Michael Seifert

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