今天,我在C#列表中遇到了一个小故障,或者至少看起来像是我的一个,所以我想我会问.这是代码:
// in main
List<Move> LM = new List<Move>();
LM.Add(new Move(4, 7));
// in Move
public Move(int ccc, int rrr)
{
col = ccc;
row = rrr;
scr_check_duplicates();
}
public void scr_check_duplicates()
{
foreach (Move M in Main.LM)
{
if (M.col == col && M.row == row)
Main.LM.Remove(this);
}
}
Run Code Online (Sandbox Code Playgroud)
好吧猜怎么着?Remove()没有做任何事情!如果你想自己搞清楚,请继续.否则,原因如下:
在跟踪它一段时间之后,我相信这是因为在新的Move()构造函数的中间,该对象实际上还没有被添加到列表中,因为它仍在初始化.
问题是,这是故障还是C#故意这样做?在我看来,如果它只是继续添加一个新的Move,然后调用构造函数,它将工作正常,而不会破坏任何可想到的代码.有没有更好的方法来做我想要的?理想情况下,我希望能够立即删除构造函数或它调用的任何函数.
没有故障.想想先执行什么.你的代码与此相同......
// in main
List<Move> LM = new List<Move>();
Move move=new Move(4, 7);
LM.Add(move);
Run Code Online (Sandbox Code Playgroud)
因此构造函数在项目添加到列表之前完全运行.因此,在您调用Main.LM.Remove(this);该项目的时间点尚未在LM中,因此无需删除任何内容.
此外,当您在一个遍历集合的foreach块内时,您无法在集合上调用Remove.