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

Mih*_*ela 11 delphi generics containers delphi-xe

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

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

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

我问,因为我有XE,我不确定它是否已被添加.谢谢.

Dav*_*nan 9

可能是最接近德尔福类似物std::vector<T>TList<T>.您可以使用循环遍历列表for in:

var
  Item: Integer;
  List: TList<Integer>;
....
for Item in List do
  Writeln(Item);
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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

  • Lambda/Closure/Anonfunction语法在delphi中是如此的CLUNKY,它非常棒,你不需要它用于`for`循环.像往常一样C++成语,不能很好地转换为pascal.但是C#和Delphi确实非常接近. (3认同)