2011-04-28 77 views
8

我必须声明,像这样一个过程:如何检查是否一个动态数组为空

procedure MyProc(List: Array of string); 

我想知道如何检查List参数为空。

例如:

procedure MyProc(List: Array of string); 
begin 
    if List=[] then // here I want to check if the List array is empty 
    //do something 
    else 
    //do something else 
end; 

我怎样才能做到这一点?

+4

你应该写'MyProc(const List:string of array)',因为在你的代码中,所有的字符串在调用MyProc之前都被复制到一个临时数组中。并且'如果pointer(List)= nil then'是检查动态数组是否为空的最快方法。 – 2011-04-28 06:46:13

+1

'指针(列表)'放弃类型安全并依赖于实现细节 – 2011-04-28 15:51:09

回答

22

可以使用Length函数

procedure MyProc(List: Array of string); 
begin 
    if Length(List)=0 then // is empty ? 
    //do something 
    else 
    // do something else 
end; 
7

空阵列等于nil

if List = nil then // it's empty 

(这也意味着SetLength(List, 0)List := nil是等价的命令。)

空阵列具有最后一个指数小于第一个指数,对于打开排列Ÿ在你的榜样是指具有负的最后一个索引:

if High(List) < 0 then // it's empty 

这意味着,如果你想避免跑空阵列上的循环,你没有做什么特别的。只要写循环,你通常会:

for i := Low(List) to High(List) do // won't run if List is empty 
+0

你确定'if List = nil then'吗?这一行不能编译。 – RRUZ 2011-04-28 06:25:25

+0

'如果pointer(List)= nil then'是检查动态数组是否为空的最快方法(最快比'length(List)= 0') – 2011-04-28 06:44:39

+2

@RRUZ:这是因为'List = nil'只能用于'动态数组'(就像这个问题的标题一样),但不是'开放数组'(就像这个问题的例子)。海报混合动态和开放的阵列。 – 2011-04-28 06:45:29

3

个人而言,我总是写

if Assigned(List) then 

而不是

if List<>nil then 

,因为我相信它读取更好,而不是只为动态数组。


的答案为动态阵列的问题,但你的例子是开放阵列,所以这里有两种可能的问题。

对于开放式数组,我会使用Length()high()根据数组大小做出决定。我不会被Pointer(List)<>nilLength(List)<>nil更快的论据所迷惑。这些选项之间的速度差异将无法辨别,因此您应该使用最清晰可读的选项。

+0

我同意。这比类似的更像德尔福。 +1 – 0xC0000022L 2011-04-28 12:11:53

+1

我不喜欢在该主题上使用'Assigned(List)'或任何其他变体来检查数组是否为空**的想法。比较例如'TList'类。 'MyTList = nil'和'MyTList.Count = 0'之间有明显不同的含义。尽管不存在的东西不能包含任何项目 - 它不存在的事实可能是一个重大的错误。所以我宁愿坚持'长度(列表)',更好的是'对于I:=低(列表)到高(列表)',它的优点是它对于所有三种类型的数组都是一样的。 – 2011-04-28 17:26:51

+0

@Craig在实践中,我不认为人们会很容易地混淆动态数组和对象,但我确实明白你的观点。 – 2011-04-28 17:33:00