在Delphi中是否存在foreach泛型方法,可以使用匿名函数调用

时间:2012-03-09 18:06:53

标签: delphi generics containers delphi-xe

我可以在C ++中执行以下操作

for_each(vec->begin(), vec->end(), [](int n){cout << n << " " << endl;});

我想在Delphi中做同样/类似的事情。 我之前向{+ 3}}的C ++开发人员询问过,并希望在OOP Pascal中生成类似的示例。 问题的lambda(匿名方法)部分真的不相关,但我想知道我是否可以在Delphi XE2中做同样的事情。

我问,因为我有XE,我不确定是否已添加。 感谢。

1 个答案:

答案 0 :(得分:9)

std::vector<T>类似的最接近的Delphi类似物TList<T>。您可以使用for in循环遍历列表:

var
  Item: Integer;
  List: TList<Integer>;
....
for Item in List do
  Writeln(Item);

如果您有动态数组而不是TList<T>,那么您可以使用for in来迭代元素。实际上,所有内置容器都支持for in,并且很容易将for in的支持添加到您自己的类中。

在C ++中,没有像for in循环那样的东西,因此习惯用法是使用STL算法。这就是驱使你使用匿名功能的原因。在使用for in语法的Delphi中,您可以以自然的方式表达“迭代容器的所有成员”,而无需借助匿名方法。

在Delphi 2009中将泛型添加到Delphi中,并且在Delphi 2005中添加了for in循环,因此在XE中可以使用所有这些。对于它的价值,匿名也在Delphi 2009中添加。

你必须意识到Delphi泛型的功能不如C ++模板。虽然您谈到了通用foreach,但您的代码在专用于int的意义上并不是通用的。您可以用C ++编写代码的通用版本,但由于与模板相比,泛型的固有局限性,使用Delphi泛型会更加困难。在Delphi中以通用方式编写上述代码的尝试将在您尝试调用Writeln时创建。虽然这对于C ++模板来说是微不足道的,但对于泛型来说却是令人沮丧的。

更新:在评论中,您询问是否有一种灵活的方式将一个容器的内容添加到另一个容器中。 AddRange方法可以做到这一点。 TList<T>.AddRange()有三个重载变体,它们会收到以下输入参数之一:array of TCollection: IEnumerable<T>Collection: TEnumerable<T>。所有标准通用容器都遵循类似的模式。