我正在尝试学习Delphi中的泛型,但是TList有一个非常基本的问题。
我已经成功创建了一个列表整数,并用1000个奇数填充它。我想更改列表中可被3整除的每个数字。我认为我可以做这样的事情。
For I in Mylist Do
Begin
If (I mod 3)= 0 Then
I:=0;
End;
这显然不起作用所以我希望有人解释会发生什么。
答案 0 :(得分:7)
您正在使用for..in
循环,该循环使用只读枚举器。这段代码:
For I in Mylist Do
Begin
If (I mod 3) = 0 Then
I := 0;
End;
实际上是这样做的:
Enum := Mylist.GetEnumerator;
while Enum.MoveNext do
Begin
I := Enum.Current;
If (I mod 3) = 0 Then
I := 0;
End;
这就是为什么你不能修改for..in
循环中的列表内容。您必须使用旧式for
循环,使用TList<T>.Items[]
属性来访问值:
For I := 0 to Mylist.Count-1 Do
Begin
If (Mylist[I] mod 3) = 0 Then
Mylist[I] := 0;
End;
更新:要删除零,您可以执行以下操作:
For I := Mylist.Count-1 downto 0 Do
Begin
If Mylist[I] = 0 Then
Mylist.Delete(I);
End;
或者,在初始循环中执行此操作,因此您不需要第二个循环:
For I := Mylist.Count-1 downto 0 Do
Begin
If (Mylist[I] mod 3) = 0 Then
Mylist.Delete(I);
End;
答案 1 :(得分:4)
您的代码无法正常工作,因为您正在尝试修改循环中的循环控制变量(I
),这是不允许的。它告诉你在编译错误中:
[dcc32 Error] Project1.dpr(23): E2081 Assignment to FOR-Loop variable 'i'
如果要修改列表,则需要以旧式方式(按索引)遍历列表。
for i := 0 to List.Count - 1 do
if (List[i] mod 3) = 0 then
List[i] := 0;
答案 2 :(得分:0)
uses
System.Generics.Collections;
procedure TForm1.BitBtn1Click(Sender: TObject);
var
_List: TList<integer>;
i: integer;
begin
_List := TList<integer>.Create;
try
// Add few odd numbers
for i := 0 to 100 do
begin
if (i mod 2) <> 0 then
_List.Add(i);
end;
// Replace numbers with 0 that divides by 3
for i := 0 to _List.Count - 1 do
begin
if (_List[i] mod 3) = 0 then
_List[i] := 0;
end;
// Show new list
for i := 0 to _List.Count - 1 do
OutputDebugstring(PWideChar(IntToStr(_List[i])));
finally
FreeAndNil(_List);
end;
end;
您不会更改迭代本身(例如i),您想要更改值(例如_List [i])