【问题标题】:Foreach/for loop with List<T> won't update properly带有 List<T> 的 Foreach/for 循环不会正确更新
【发布时间】:2025-12-08 07:55:01
【问题描述】:

我在使用 foreach 循环和 List&lt;T&gt; 时遇到了一些问题

foreach (DefenceTerminal defence in DefenceManager.defenceCollection)
{
    defence.ReadNetworkPacket(packetReader);
    //this is a very simple function that just sets defence.damage = to whatever
    //it properly sends the value and sets it
    //defence.damage is a int
}

当我离开循环时,值...消失了。 (改不了)

一旦离开循环,所有值都保持不变

在更新中以类似的方式访问列表。

我也使用了for 循环作为替代方案,所以我想这更像是List&lt;T&gt; 问题而不是其他任何问题。

不过,我更愿意继续使用列表。有什么建议吗?

对于那些想要非常简单的功能的人来说,这里是非常简单的功能

    public void ReadNetworkPacket(PacketReader packetReader)
    {
        damage = packetReader.ReadInt32();
    }

IT 工作,列表和循环不工作。

再次:虽然在循环中一切正常,但我已经检查了多次,但它并没有......坚持......就像它制作了自己的小个人列表来搞乱然后在完成后将其丢弃,这当您尝试更新列表时没有帮助。我敢肯定,这是一个与 List 有关的奇怪特质。

其他废话:

public static List<DefenceTerminal> defenceCollection = new List<DefenceTerminal>();

        for (int i = 0; i < factionCount; i++)
        {
            DefenceTerminal d = new DefenceTerminal();
            for (int j = 0; j < defenceLimit; j++)
            {
                defenceCollection.Add(d);
            }
        }

【问题讨论】:

  • 你说的值消失是什么意思?
  • 它一旦离开循环就无法改变,它保持原样,任何访问都表明它的价值没有改变。
  • 你能澄清哪个值消失了吗?是defence.damage吗?
  • 如果没有看到 DefenceManager.defenceCollection 的代码(它是如何创建的以及它是字段还是属性)和 DefenceTerminal.ReadnetworkPacket 的代码,除了猜测之外很难做更多的事情。
  • 请出示ReadNetworkPacket()的源代码

标签: c# list loops xna


【解决方案1】:

请发布更多代码,但我觉得您创建的集合过于本地化,请将其移到类范围的更高位置,就像整个类的私有成员变量一样。

【讨论】:

    【解决方案2】:

    听起来DefenceTerminalstruct,因此是value 类型。这意味着当您浏览foreach loop 时,您只是在更改一个副本。尝试使用经典的 for loop 并改为索引实际列表。

    【讨论】:

    • 它是一个类,正如我所说,for 循环会导致同样的问题。