C#操作Animal数组调用RemoveAt无法删除元素且出现多余1开头行如何解决
问题原因及修复方案
问题根源
- 执行顺序错误:打印操作在删除操作之前执行,你输出的是删除前的数组内容,自然看不到删除效果。
- 删除操作未生效:
my_animal.ToList()会生成一个和原数组内容一致的新List副本,你对这个副本执行RemoveAt不会修改原my_animal数组,也没有把修改后的内容赋值回原变量,等于删除操作完全没有作用到实际使用的数组上。 - 计数变量未同步:你遍历用的
cont_animal是自行维护的有效元素计数,删除元素后没有将该值减1,就算后续再打印还是会遍历原来的长度。 - 多余的空对象赋值:你开头给
my_animal[idxtoRemove]赋值空Animal对象的操作完全多余,会导致打印时对应位置出现一行属性全为默认值的记录,也就是你看到的多余行。
修复代码
private void retirerUnAnimalDeListe(int idxtoRemove) { // 先执行删除操作 var tolist = my_animal.ToList(); tolist.RemoveAt(idxtoRemove); // 将修改后的集合回写给原数组变量 my_animal = tolist.ToArray(); // 同步更新有效元素计数 cont_animal = my_animal.Length; // 再打印删除后的结果 for (int i = 0; i < cont_animal; i++) { Console.Write(i + "\t"); Console.Write("{0,-10}", my_animal[i].m_type + "\t"); Console.Write("{0,-10}", my_animal[i].m_name + "\t"); Console.Write("{0,-10}", Convert.ToString(my_animal[i].m_age + "\t")); Console.Write("{0,-10}", Convert.ToString(my_animal[i].m_poids + "\t")); Console.Write("{0,-10}", my_animal[i].m_color + "\t"); Console.Write("{0,-10}", my_animal[i].m_owner + "\t"); // 增加换行避免所有行挤在一起 Console.WriteLine(); } }
优化建议
如果你需要频繁对集合做增删操作,建议直接用List<Animal>类型替代数组,不需要每次手动做数组和List的转换,性能更优,代码也更简洁。
内容的提问来源于stack exchange,提问作者Alen Husic
相关产品推荐
相关产品推荐

