如何在使用for-in循环进行迭代时更新List?

时间:2014-07-21 17:20:25

标签: delphi for-loop

我正在尝试学习Delphi中的泛型,但是TList有一个非常基本的问题。

我已经成功创建了一个列表整数,并用1000个奇数填充它。我想更改列表中可被3整除的每个数字。我认为我可以做这样的事情。

For I in Mylist Do
Begin
  If (I mod 3)= 0 Then
    I:=0;
End;

这显然不起作用所以我希望有人解释会发生什么。

3 个答案:

答案 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])