这可能是一个愚蠢的问题,但还没有找到一个简单的答案......
我正在尝试将一个简单的c#字节数组插入到特定位置的另一个字节数组中。例如。现有的字节不应该被覆盖,而只是向后移动。真的就像你在现有文本块中复制页面一些文本块一样。
但我认为这是常见的事情,应该更容易吗?或者我错了吗?
答案 0 :(得分:8)
但我认为这是常见的事情
如果您经常将大量数据插入另一大块数据的中间,那么您可能会考虑使用旨在实现此目的的数据结构。数组被设计为固定大小并且在内容中可变。如果您的要求包含“变量大小”,那么数组对您来说是错误的数据类型。请考虑使用双向链表或可连接的双端队列。
应该更容易?
您已经确定了一个简单的四步算法,可以满足您的需求。它并没有那么容易。
答案 1 :(得分:6)
使用List<byte>
代替byte[]
;它将提供您正在寻找的灵活性......
List<byte> b1 = new List<byte>() { 45, 46, 47, 50, 51, 52 };
List<byte> b2 = new List<byte> { 48, 49 };
b1.InsertRange(3, b2);
然后,如果你因为某种原因需要回到byte[]
,你可以打电话......
b1.ToArray();
答案 2 :(得分:4)
请看Array.CopyTo
。
从指定的目标数组索引开始,将当前一维数组的所有元素复制到指定的一维数组。
答案 3 :(得分:1)
如果表现不重要,请考虑:
var combined = first.Take(insertPosition)
.Concat(second)
.Concat(first.Skip(insertPosition))
.ToArray();
我认为这几乎是你建议的四步算法,除了第一步“结束时”。但是,请注意,由于多种原因,这是低效的,包括不必要的动态缓冲区和第一个阵列的冗余部分枚举。
否则,你所建议的完全没问题。
答案 4 :(得分:0)
如果您可以将对象换成更大的东西,那么您可以查看具有InsertRange方法的List之类的东西(http://msdn.microsoft.com/en-us/library/) 884ee1fz.aspx)。当然,使用不同的对象可能不是一种选择,但它建议一种简单的方法来做事。其他对象也可能更有用。到处走走...... :)
答案 5 :(得分:0)
根据定义,数组具有固定大小。您不能插入或删除元素,只需覆盖元素。
您应该使用列表。列表提供了插入或删除元素和子范围的方法。