Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 表示大字节数组的最佳方法_C#_Arrays - Fatal编程技术网

C# 表示大字节数组的最佳方法

C# 表示大字节数组的最佳方法,c#,arrays,C#,Arrays,我正在寻找在内存中存储和管理大字节数组的最有效方法。我需要在数组中的任何位置插入和删除字节 起初,我认为正则数组是最好的 byte[] buffer = new byte[ArraySize]; 这将允许我访问数组中的任何字节。我还可以调整数组的大小。但是,似乎没有任何内置支持在阵列中移动或移动项目 一种选择是使用循环逐个移动项目,但在C#中这听起来效率非常低。另一个选项是创建一个新数组并将字节复制到正确的位置,但这需要复制数组中的所有数据 没有更好的选择了吗?事实上,我刚刚找到了,它似乎非常

我正在寻找在内存中存储和管理大字节数组的最有效方法。我需要在数组中的任何位置插入和删除字节

起初,我认为正则数组是最好的

byte[] buffer = new byte[ArraySize];
这将允许我访问数组中的任何字节。我还可以调整数组的大小。但是,似乎没有任何内置支持在阵列中移动或移动项目

一种选择是使用循环逐个移动项目,但在C#中这听起来效率非常低。另一个选项是创建一个新数组并将字节复制到正确的位置,但这需要复制数组中的所有数据


没有更好的选择了吗?

事实上,我刚刚找到了,它似乎非常适合我的需要


看起来
BlockCopy
方法将阻止复制一组项目,并支持在同一数组中进行复制,甚至可以正确处理重叠的项目。

我认为在这种情况下,最好的选择是在常规数组和列表之间进行混合。不过,这仅在兆字节大小的阵列中才有必要

所以你可以这样做:

List<byte[]> buffer;
列表缓冲区;
让列表中的每个元素都只是一块数据(比如64K或一些小的、可管理的)

它需要相当多的自定义代码,但在必须在大型数组中移动数据时,它肯定是最快的选择

此外,如果你做的字节移位比其他任何事情都要多,
LinkedList
可能会更好(但除了一组特定的情况外,这对所有事情都是非常糟糕的)

为了解释为什么它比数组更正确,考虑将1字节插入数组的开头。您必须分配另一个数组(内存消耗加倍),然后在插入新字节后将每个字节复制到新数组,然后释放旧数组(可能的堆损坏取决于大小)

现在考虑使用列表的这种方法

如果必须插入大量字节,可能需要在
缓冲区
列表的开头插入。这是一个O(n)操作,因此此操作的最终效率为O(n/CHUNK\u SIZE)


或者,如果只需要插入一个字节,则只需获取列表的第一个元素,然后像正常情况一样复制数组。然后,速度是O(CHUNK_SIZE),这并不可怕,特别是如果相比之下
n
非常大(兆字节的数据)

Um,那么
列表如何?它不使用底层数组吗?我还没有详细研究过它,但我假设它不如常规数组有效。@Lewsterin是的。列表基本上是对数组的抽象。他认为数组(几乎)比列表快是正确的。这还不足以让人担心我的想法,我觉得情况并非如此。大多数较低级别的.NET方法都是用手工优化的汇编语言编写的(并且有移动字节块的特定机器指令)。我希望这比在循环中复制每个字节快很多倍。这似乎不允许移位。@smdrager:我必须自己实现一些逻辑。例如,如果我在开头插入一个字节,那么我将从第一个字节开始复制到第二个字节开始的区域。看起来BlockCopy将确保以正确的顺序复制项目,因此这种重叠不会导致问题。然后我可以添加新项目。类似的删除交易。是的,对于常规复制,这是正确的。一维数组具有专门用于复制周围位的IL操作码。但是,它不能处理诸如移动或插入元素之类的事情。。。如果使用的是大量数据,那么数组就是错误的数据结构sets@JonathanWood您对优化编译器(和JIT)的信心很小,我编写了一个十六进制编辑器(C++),它使用技巧来快速管理许多兆字节的数据。但这似乎超出了我目前的需要。我只是想要一个很好的紧凑的方式来存储一堆字节并进行一些转换。在我的问题中,我说的是大数组,但实际上我想到的是远小于兆字节的数组。链表将使用每个字节数个字节的存储空间,并且在转换为实际字节(例如转换为文件)时会产生大量开销。对我来说,这似乎不是正确的方法。@JonathanWood我不是在建议一个字节链表。我建议使用一个字节数组的链接列表(很可能只是常规列表)。但是,如果您处理的数据少于1兆字节,除非它对性能非常关键,否则我认为我的答案对您毫无帮助