C#List - 一次更有效的倍数insertRange通过列表中的班次

时间:2017-04-26 13:34:52

标签: c# arrays list data-structures insert

我有一个列表,我将其划分为固定数量的部分(其中一些部分可能为空)。
每个部分都包含无序元素,但是部分本身是向后排序的。
我通过固定维度数组引用节的每个开头,其元素是可以在列表中找到每个节的索引。
我经常在列表的尾部提取整个部分,当我这样做时,我将其在数组中的索引设置为0(因此该部分将从列表的头部开始重新生成)然后我循环地增加lastSection我用来跟踪哪个部分位于列表尾部的变量。
在频率相同的情况下,我还需要在列表中插入一些新元素,这些元素将分布在一个或多个部分中。
我选择了一个单独的分段列表(而不是列表列表或类似的东西)因为,即使这些部分可能变化很大(从空到数千的长度),元素的总数在应用程序期间几乎没有变化运行时因为我还经常需要获取列表中的所有元素,并且不想连接多个列表以获得结果。

Graphical representation of the data structure

存在问题:
到目前为止,我在选择数据结构时遇到了一些错误,因为这些描述都是我用它做的所有操作?

前进:
我试图解决的问题,因为这是我正在构建的应用程序的核心(我想要挤出每一片性能,因为它应该在智能手机上运行),是:我怎么能做那些多个插入作为尽可能快?

琐碎的解决方案:
对于属于某个部分的每个新元素组,只需执行insertRange(sectionBeginning,groupOfElements)。
性能足迹:
每个insertRange都会强制列表将一个部分的根之后的所有内容移到右边,并且使用多个insertRange这意味着一些数据将被移位甚至M次,其中M是使用索引完成的insertRange的数量!= list .Count之间。

更聪明的解决方案:
知道每个多插入步骤之前以及每个部分需要添加多少个新元素,我可以在列表的后面添加空元素,执行确定大小的M个移位,然后将新元素复制到相应的&#34 ;孔"留在列表中。
我可以扩展列表类并实现一个新的insertRange(int []索引,IEnumerable []集合),其中每个索引指向一个部分的开头,但是我担心列表类可能具有的一些可能的内部优化,以及可以改变我的for循环转换性能更差,就像我认为没有访问权限的Array.Copy。有没有办法做一个高性能的列表转换,以实现这一点并获得一些优于多个标准insertRanges的优势?
注意:索引和集合应按部分排序。

Graphical representation of the multiple-at once insertRange approach

关于insertRange的另一个类似线程:
Replace multiple InsertRange() into efficient way

关于名单变化的另一个类似线索:
Does code exist, for shifting List elements to left or right by specified amount, in C#?

0 个答案:

没有答案