在Pascal中有两种类型声明:
前者只是创建方便的速记,如C中的typedef.别名是彼此兼容的,与原始类型兼容.创建的类型是故意不兼容的,并且在没有明确和不安全的情况下通过类型转换不能混合.
var
nn: NewName; nt: NewType; ot: OldType;
...
nn := ot; // should work
nt := ot; // should break with type safety violation error.
nt := NewType(ot); // Disabling type safety. Should work even if
// it has no sense semantically and types really ARE incompatible.
Run Code Online (Sandbox Code Playgroud)
根据我的理解,这些是Pascal基础知识.
现在让我们看一个特定类型和两个别名:
我有一个记录类型定义为:
type
TRecordType = record
Field1: string;
Field2: Variant;
end;
Run Code Online (Sandbox Code Playgroud)
当我以这种方式定义一个函数时:
function Function1(const Records: TArray<TRecordType>): TAnyOtherClass;
Run Code Online (Sandbox Code Playgroud)
并这样称呼:
Function1([BuildRecord('string', value), BuildRecord('OtherString', otherValue)])
Run Code Online (Sandbox Code Playgroud)
编译器说:
[DCC错误] AnyUnit.pas(142):需要E2001序数类型
我很早以前就读过一些地方,Delphi的编译器在一种预处理器中处理泛型,并在代码中某种形式的字符串替换,然后我希望Function1计算结果类似于:
function Function1(const Records: array of TRecordType): TAnyOtherClass;
Run Code Online (Sandbox Code Playgroud)
因为TArray是定义的TArray<T> = array of T;。
我认为这没有发生,因为当我将函数声明更改为:
function Function1(const Records: array of TRecordType): TAnyOtherClass;
Run Code Online (Sandbox Code Playgroud)
编译代码时没有错误或警告。
这个问题有一个答案,链接到一篇说明差异的文章,但是链接断开了。所以我的问题是,TArray<T>如果不是,那意味着什么array of T?
我有很多文件(大约160 000),我需要有关于文件中单个单词位置的信息(全文).所以我用这样的字典:
WordDict : TDictionary<string, TDictionary<string, TIntegerDynArray>>;
Run Code Online (Sandbox Code Playgroud)
现在我知道WORD1在FILE1,FILE3和FILE100中并且位于每个文件<1,3,5>,<2,8,35>等等.我可以填写它,我可以使用它 - 它非常快.但我不知道如何有效地存储字典文件.
编辑:有效 - 我的意思是快速和小文件
如何在不创建/定义x整数的情况下创建x整数数组.此示例将创建一个10整数数组(在每个元素中预先填充零):
var
IntArray : TArray<Integer>;
begin
IntArray := TArray<Integer>.Create(0,0,0,0,0,0,0,0,0,0);
end;
Run Code Online (Sandbox Code Playgroud)
所以我创建了一个长整数为120的整数数组,这看起来很乱:
IntA := TArray<Integer>.Create(
0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0);
Run Code Online (Sandbox Code Playgroud)
现在我需要创建一个9000个整数的数组,我不需要(或想要)用9000个零预先填充数组.
有这样的命令:
IntA := TArray<Integer>.Array[0..9000]; //This doesn't work
Run Code Online (Sandbox Code Playgroud)
谢谢.
很多时候,当使用通用数组时,我需要知道我正在使用的数组的最大长度.很长一段时间我一直在使用:
MaxIntValue([Length(Array1), Length(Array2) , Length(Array3)]); // from Math unit
Run Code Online (Sandbox Code Playgroud)
然后我用我的方法简化了这个(跳过输入Length()):
// array of array of TCardBrand
function GetMaxLength(const aArrays: array of TArrayOfCarBrand): integer;
Run Code Online (Sandbox Code Playgroud)
效果很好,但现在我想创建一个通用的MaxLength,我无法使其工作
class function MaxLength<T>(aArrays: array of array of T): integer; - it gives error: [dcc32 Error] Unit2.pas(31): E2029 Identifier expected but 'ARRAY' found
Run Code Online (Sandbox Code Playgroud)
这是我正在测试的代码,使用Math单元中的MaxIntValue和我的方法示例的工作示例,但扩展通用TArray不起作用:
TCarBrand = record
BrandID: integer;
BrandName: string;
BrandCountry: string;
end;
TArrayOfCarBrand = array of TCarBrand;
TArray = class(System.Generics.Collections.TArray)
public
// ERROR: E2029 Identifier expected but 'ARRAY' found
class function MaxLength<T>(aArrays: array of array …Run Code Online (Sandbox Code Playgroud) 我曾在多次读取的回答这个有关的问题TArray<T>和array of T.根据我的理解,第一个的使用比后者更通用,因为对于动态数组我应该声明类似......
type
TMyFlexibleArray = array of Integer;
Run Code Online (Sandbox Code Playgroud)
......这是必要的(在某些情况下)因为我无法返回array of Integer例如.相反,当然,我可以返回泛型类型.动态数组没有固定长度,并且使用SetLength过程重新分配它们的内存.TArray是一个静态方法的泛型类; 有关它的文档说明:
您不应该创建此类的实例,因为它的唯一目的是提供排序和搜索静态方法.
它们具有两种不同的性质/功能,但是它们具有相同的结果(例如,当作为参数传递时或者当我只需要一个灵活的容器时)?我看到TArray也有一些有用的方法.
如果我说这TArray<T>是一个用泛型构建的动态数组并且type K = array of T是一个自己的动态数组(自定义数组),那是正确的吗?在我的问题中,我假设它们在作为动态数组的功能上是等价的(我更喜欢通用的方式只是为了舒适).