使用特定条件将list1中的内容复制到list2

时间:2011-11-23 17:18:07

标签: delphi delphi-xe2

如果我有两个如此定义的泛型列表:

type
  pMyList = record
    a, b: integer;
    c: string; 
  end;
  TMyList = TList<pMyList>;

var
  list1, list2: TMyList;

只有在某些字段尊重条件时,才会有一些功能复制内容从列表(es:list1)到其他列表(es:list2)?例如,我希望从list1中的list2中复制所有记录,其中a是相同的值,例如1。 结果是在list2中我有list1的所有记录,其中a = 1,排除所有其他记录,其中a是不同于1的值。 我真的已经解决了这个问题:

for iIndex := 0 to Pred(list1.Count) do
  if list1[iIndex].a = myvalue then list2.Add(list1[iIndex]);

但想知道是否有更具体的东西来执行此操作,例如使用delphi的某些功能。 再次感谢。

2 个答案:

答案 0 :(得分:4)

不幸的是,因为Delphi缺少使用Collections的lambda表达式,或者Spring框架中的泛型列表可以使源代码更长一些。也有些人不喜欢使用匿名方法,因为它们的语法非常繁琐。但这是一个品味的问题。

使用Collections,您的示例将如下所示:

list2.AddAll(list1.Where(
  function(value: pMyList): Boolean
  begin
    Result := value.a = myvalue;
  end));

请记住,两个提到的通用列表实现都在实现接口,并且大多数方法都在使用它们。在上面的示例中,无关紧要,因为您没有直接传递list1。否则它将被释放。

使用这个例子,使用它们的好处可能并不清楚,但是当你进行大量操作,过滤数据,将它们放入其他列表等等时,它变得更容易,你不必编写大量额外的方法做这些操作。但正如我所说,这是一个品味问题,许多delphi开发人员似乎不喜欢这种语法和编写代码的方式。

答案 1 :(得分:0)

这个怎么样?

class procedure TCollectionUtils.CopyItems<T> (List1, List2 : TList <T>; Pred : TFunc <T, Boolean>);
var
 Item : T;
begin
for Item in List1 do
  if Pred (Item) then
    List2.Add (Item);
end;

电话会是这样的:

TCollectionUtils.CopyItems <pMyList> (list1, list2,
  function (Item : pMyList) : Boolean
  begin
  Result := (pMyList.a = 1);
  end);

(现在没有Delphi)