C# 对于1之后的循环中断

C# 对于1之后的循环中断,c#,for-loop,foreach,C#,For Loop,Foreach,我有一个for循环,在循环一次后它一直断开,但我不确定它为什么这样做 for (int fX = 1; fX < 17; fX++) { foreach (RoomItem OldItem in Room.GetRoomItemHandler().GetFurniObjects(fX, 26)) { Logging.WriteLine(OldItem.BaseItem.ToString()); Room.GetRoomItemHandler

我有一个for循环,在循环一次后它一直断开,但我不确定它为什么这样做

for (int fX = 1; fX < 17; fX++)
{
    foreach (RoomItem OldItem in Room.GetRoomItemHandler().GetFurniObjects(fX, 26))
    {
        Logging.WriteLine(OldItem.BaseItem.ToString());

        Room.GetRoomItemHandler().RemoveRoomItem(OldItem, false);
    }
}
但是控制台应该输出(1、2、3等等)
有什么想法吗?我甚至尝试锁定foreach迭代,但没有成功。

在迭代过程中修改集合。这会导致未定义的行为

您可以使用
foreach
常量列表解决此问题,如下所示:

foreach (RoomItem OldItem in 
    Room.GetRoomItemHandler().GetFurniObjects(fX, 26).ToList())
{
     ...
}

但是我认为您应该重新考虑一下您的设计。

您不应该在使用for循环遍历集合时更改集合,使用while或do while重新写入。

您在哪里向控制台写入内容?哦,对不起,Logging.WriteLine正在向控制台写入内容。Console.WriteLine仍显示相同的结果。如果GetFurniObjects返回空集合,则不会执行内部循环的主体。你能发布该函数的源代码吗?你有没有尝试在它上附加调试器并单步执行?你发现了什么?我试着锁定它,但它不起作用,我该如何修复它?我会使用
ToArray()
,而你不会在列表中添加任何内容。啊,现在我想起来了。枚举错误。对不起,我忘了。非常感谢。如果
Room.GetRoomItemHandler().GetFurniObjects(fX,26)
返回真正的“IEnumerable”,则ToList()实际上会更快一些,同时可能会使用更多内存。
foreach (RoomItem OldItem in 
    Room.GetRoomItemHandler().GetFurniObjects(fX, 26).ToList())
{
     ...
}