如果我有两个如此定义的泛型列表:
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的某些功能。 再次感谢。
答案 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)