【问题标题】: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) 会让您专注于完成工作,而不是大惊小怪地复制数组值等.
  • 你并不真正想要一个数组,而是一个 List
  • @Damien_The_Unbeliever 我需要将带有文件流的结果数据写入文件,这就是它的字节数组的原因
  • 如果您使用.net 5.0 或更高版本,您可以将List<byte> 写入FileStream,而无需使用fileStream.Write(CollectionsMarshal.AsSpan(listOfBytes)); 转换为数组(这不会复制数据所以它非常有效,但是当fileStream.Write() 正在做它的事情时,你不能在另一个线程中更改listOfBytes。)

标签: c# arrays


【解决方案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

【讨论】:

    猜你喜欢
    • 2019-02-17
    • 2010-10-29
    • 2010-09-06
    • 1970-01-01
    • 2010-11-19
    • 1970-01-01
    • 2012-10-18
    • 2018-03-02
    • 1970-01-01
    相关资源
    最近更新 更多