首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >德尔福TList<T>复制成另一个TList?

德尔福TList<T>复制成另一个TList?
EN

Stack Overflow用户
提问于 2014-11-03 19:50:02
回答 4查看 8.7K关注 0票数 2

我想知道是否有任何安全的方法将TList元素复制到任何其他TList中,以特定的位置和特定的长度。我应该只是将list1的元素分配给list2,还是有什么功能是我不知道的,可以更准确地处理呢?

谢谢你慢慢来。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2014-11-03 20:25:55

如果您的意图是替换项,而不是在给定位置插入它们,那么答案是没有直接的机制,迭代分配是使用的方法。

代码语言:javascript
复制
for i := 1 to maxItems do
  dest[ insertPos + i - 1] := src[ i - 1 ];

在这种情况下,您应该考虑添加比目标列表有更多空间的项目的情况。这是否意味着只替换尽可能多的“适合”的项目,添加额外的项目‘腾出空间’或根本不分配任何(除非所有将适合),是一个问题,只有您的要求可以回答。

但是,如果您的目的是将项插入到目标列表中,则可以将InsertRange()Copy()与源列表维护的内部数组结合使用。例如,使用TList的两个实例

代码语言:javascript
复制
var
  src, dest: TList<String>;
  insertIndex, maxItems: Integer;

dest.InsertRange( insertIndex, Copy( src.List, 0, maxItems ) );

要插入整个src列表,您不需要使用Copy(),而是可以在方法中直接引用源列表:

代码语言:javascript
复制
dest.InsertRange( insertIndex, src );

性能说明:

如果源列表很大,并且/或添加的子项目数量较少,那么使用Copy()可能是一项昂贵的操作。但是,将项目实际插入到目标列表中是非常有效的,因为InsertRange()方法能够在一次操作中为目标列表中的新项腾出空间,然后在为它们创建的空间中插入新项,因此对于要添加的更多项,它可能仍然是最有效的。

另一种方法是迭代地分别插入源项:

代码语言:javascript
复制
for i := 1 to maxItems do
  dest.Insert( insertIndex, src[i - 1]);

虽然这避免了插入数组项,但如果目标列表很大且插入的项目数量更多,则迭代插入本身就可能效率低下,因为目标列表中的每个项目都必须为每个插入分别留出空间(尽管通过显式计算和预先分配目标列表的容量,可能会显著改善这种情况的潜在影响)。

例如,如果要将100项从1000项列表中插入到2000项列表的(确切)中间:

代码语言:javascript
复制
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()方法可能会带来过多的开销。

正如我认为应该很明显的那样,不同的启动条件将决定这两种方法中哪一种是最有效的,如果性能是一个重要的问题,就应该考虑。

票数 6
EN

Stack Overflow用户

发布于 2014-11-03 20:19:12

我将使用AddRange在末尾添加项,或者使用InsertRange在特定索引上插入项。

票数 6
EN

Stack Overflow用户

发布于 2020-10-01 08:00:08

除了来自Enny的答案之外,Assign还从目标列表复制(清除源列表的内容)。

代码语言:javascript
复制
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();
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26721955

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档