我想知道是否有任何安全的方法将TList元素复制到任何其他TList中,以特定的位置和特定的长度。我应该只是将list1的元素分配给list2,还是有什么功能是我不知道的,可以更准确地处理呢?
谢谢你慢慢来。
发布于 2014-11-03 20:25:55
如果您的意图是替换项,而不是在给定位置插入它们,那么答案是没有直接的机制,迭代分配是使用的方法。
for i := 1 to maxItems do
dest[ insertPos + i - 1] := src[ i - 1 ];在这种情况下,您应该考虑添加比目标列表有更多空间的项目的情况。这是否意味着只替换尽可能多的“适合”的项目,添加额外的项目‘腾出空间’或根本不分配任何(除非所有将适合),是一个问题,只有您的要求可以回答。
但是,如果您的目的是将项插入到目标列表中,则可以将InsertRange()和Copy()与源列表维护的内部数组结合使用。例如,使用TList的两个实例
var
src, dest: TList<String>;
insertIndex, maxItems: Integer;
dest.InsertRange( insertIndex, Copy( src.List, 0, maxItems ) );要插入整个src列表,您不需要使用Copy(),而是可以在方法中直接引用源列表:
dest.InsertRange( insertIndex, src );性能说明:
如果源列表很大,并且/或添加的子项目数量较少,那么使用Copy()可能是一项昂贵的操作。但是,将项目实际插入到目标列表中是非常有效的,因为InsertRange()方法能够在一次操作中为目标列表中的新项腾出空间,然后在为它们创建的空间中插入新项,因此对于要添加的更多项,它可能仍然是最有效的。
另一种方法是迭代地分别插入源项:
for i := 1 to maxItems do
dest.Insert( insertIndex, src[i - 1]);虽然这避免了插入数组项,但如果目标列表很大且插入的项目数量更多,则迭代插入本身就可能效率低下,因为目标列表中的每个项目都必须为每个插入分别留出空间(尽管通过显式计算和预先分配目标列表的容量,可能会显著改善这种情况的潜在影响)。
例如,如果要将100项从1000项列表中插入到2000项列表的(确切)中间:
InsertRange( Copy() ) Copy 100 items into an intermediate array
Moves 1000 items in the dest list to make room for 2100 (total)
Inserts 100 items into the 'blank' space
Iterative insert 100 repetitions of:
Move 1000 items in the dest list to make room for 1 more
Inserts 1 item对于插入100个项,InsertRange()可能是最有效的。相反,如果只从源列表中插入单个项,则InsertRange()方法可能会带来过多的开销。
正如我认为应该很明显的那样,不同的启动条件将决定这两种方法中哪一种是最有效的,如果性能是一个重要的问题,就应该考虑。
发布于 2014-11-03 20:19:12
我将使用AddRange在末尾添加项,或者使用InsertRange在特定索引上插入项。
发布于 2020-10-01 08:00:08
除了来自Enny的答案之外,Assign还从目标列表复制(清除源列表的内容)。
list1 := TList.Create();
for val:=1 to 3 do
list1.Add(Pointer(val)); // list1 contains {1,2,3}
list2 := TList.Create();
for val:=5 to 8 do
list2.Add(Pointer(val)); // list2 contains {5,6,7,8}
list2.Assign(list1); // list2 now contains {1,2,3}
list2.Assign(list1); // list2 still contains {1,2,3}
list2.Free();
list1.Free();https://stackoverflow.com/questions/26721955
复制相似问题