用多个byte[]填充一个byte[]

7
我创建了一个应用程序,可以将字节数组存储在我的SQLiteDatabase中。此应用程序还会每隔“x”秒从数据库中选择字节数组。
我的应用程序的数据流如下所示:
应用程序 -> SQLiteDatabase -> 应用程序
我的问题是:
我该如何使用所有来自SQLiteDatabase的字节数组填充一个字节数组?
例如:
Byte[] Data;

需要用以下字节数组填充:

Byte[] IncomingData;

IncomingData 不断被 SQLiteDatabase 填充。

Data 需要不断地用 IncomingData 进行填充。

有人可以帮我吗?


“fill” 是什么意思?您想要将它们连接起来吗? - usr
是的,例如在字符串中,它应该像这样:string str1 = "12"; string str2 = "13"; 如果您想要将它们附加在一起,则结果应该为:1213,我需要对我的字节数组执行同样的操作。 - Max
1
为什么不直接使用字节列表呢? - James
@judgeja 是的,我现在正在使用带有.Concat函数的List<byte>,它很有效! - Max
@Mobstaa,我不确定Concat是最好的选择。我不确定Linq在底层做了什么,但它可能会过度复制东西。将其性能与普通的List.Add(byte b)方法进行比较。 - uriDium
我将进行一些研究,了解列表中.Concat和.Add之间的区别。编辑:https://dev59.com/QnVD5IYBdhLWcg3wE3Ro 找到了这个线程,区别在于.Concat不会修改列表,而.Add会修改。 - Max
2个回答

4

只需使用Concat

data1.Concat(IncomingData);

您需要添加 System.Linq 命名空间的引用。


我添加了System.Linq,当我输入"data1."时,智能感知会帮助我使用Concat,但它需要"<>",这些括号中需要插入什么? - Max
1
@mobstaa 只是作为参考,<> 是指定的泛型类型。 - Liam
1
忽略智能感知,你可以将其用作通用方法,但在你的情况下不要使用<> - Mathew Thompson
好的,谢谢。我看到上面有一个答案建议使用字节列表,在我的应用程序中也是可能的。但使用Concat的唯一问题是在创建数组时需要指定数组的长度,因为我永远不知道我的字节数组有多大。 - Max
1
@Mobstaa 如果你在使用byte[]时没有指定大小初始化器,它将无法编译。如果你不知道大小,请使用List<byte>,你仍然可以在上面使用Concat - Mathew Thompson

4
有几种方法可以采用。
1.使用List<byte>List.AddRange 2.使用LINQ的Enumerable.Concat 3.手动使用Array.Copy完成所有操作
三种方法中,如果可能,请使用List,因为它会(很可能)减少所需的数组复制量。这就是List的作用,它们在幕后使用一个数组,并具有一定的容量,它从4开始,在达到容量时扩大一倍。容量甚至可以使用list.Capacity属性或带有int的构造函数设置为某个大数,就像数组一样。您始终可以使用List.ToArray将列表转换回来。
Enumerable.Concat很可能只创建最小大小的数组,这意味着每次获取更多byte时都需要创建新数组。

为什么要将其转换为列表的开销呢?正如您所说,它们在后台使用数组。 - Mathew Thompson
实际上应该是 ToArray 而不是 AsArray - juharr
.Concat将始终从两个数组创建一个新数组,如果每隔几秒钟都会发生这种情况,那么就会进行大量复制。列表可以使用容量初始化,并且仅在到达该容量时才会被复制。是的,使用ToArray函数。 - Daniel Imms

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