如何通过移位将字节插入数组?
Posted
技术标签:
【中文标题】如何通过移位将字节插入数组?【英文标题】:how to insert bytes into array with shifting? 【发布时间】:2021-11-30 01:35:19 【问题描述】:我有一个字节数组,例如:
0,1,2,3,4,5,6,7,8,9
我想将较小的数组插入:
我要在原数组第三个索引之后插入的数组:
11,11,11
所以最终的数组应该是这样的:
0,1,2,3,11,11,11,4,5,6,7,8,9
如您所见,我需要保留数组的原始值,将它们向左移动,然后用新数组代替它。 我正在调查 Array.Copy() 但它覆盖了原始值,而不是移动它们
【问题讨论】:
你需要一个新的数组来容纳组合的数组,所以分配它并使用三次Array.Copy()
来复制 array1 的第一部分,然后是 array2,然后是 array1 的第二部分。
数组是最好的数据结构吗?即使它在幕后使用数组,当然只是能够在List<byte>
上写InsertRange(3, otherData)
会让您专注于完成工作,而不是大惊小怪地复制数组值等.
你并不真正想要一个数组,而是一个 ListList<byte>
写入FileStream
,而无需使用fileStream.Write(CollectionsMarshal.AsSpan(listOfBytes));
转换为数组(这不会复制数据所以它非常有效,但是当fileStream.Write()
正在做它的事情时,你不能在另一个线程中更改listOfBytes
。)
【参考方案1】:
您可以尝试使用 Linq 来 查询 array
并将结果分配给它:
using System.Linq;
...
int[] array = new int[] 0, 1, 2, 3, 4, 5, 6, 7, 8, 9;
int[] insert = new int[] 11, 11, 11;
array = array
.Take(4)
.Concat(insert)
.Concat(array.Skip(4))
.ToArray();
如果您正在寻找低级 Array
方法:
int[] array = new int[] 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ;
int[] insert = new int[] 11, 11, 11 ;
int at = 4;
Array.Resize<int>(ref array, array.Length + insert.Length);
Array.Copy(array, at, array, at + insert.Length, array.Length - at - insert.Length);
Array.Copy(insert, 0, array, at, insert.Length);
【讨论】:
不错的最小解决方案!【参考方案2】:您可以将数组转换为列表。列表类似于数组,但您可以轻松添加、插入或删除值。请参阅此代码:
int[] array = new int[] 0, 1, 2, 3, 4, 5, 6, 7, 8, 9;
int[] insert = new int[] 11, 11, 11;
List<int> list = new List<int>(array);
list.InsertRange(4, insert);
array = list.ToArray(); // convert the list back to an array
在线演示:https://dotnetfiddle.net/GeEAeU
【讨论】:
以上是关于如何通过移位将字节插入数组?的主要内容,如果未能解决你的问题,请参考以下文章