renfeng1981 2024-06-23 00:58 采纳率: 100%
浏览 2
已结题

c# 关于循环删除连续元素的疑问

using System;
using System.Collections.Generic;


namespace ConsoleApp3
{
    class Program
    {
        static void Main(string[] args)
        {
            List<int> f = new List<int> { 14, 15, 16, 17, 18, 19 };
            Console.WriteLine(removeAllShun(f));
            Console.ReadLine();

        }

        private static int removeAllShun(List<int> datas)
        {

            for (int i = 0; i < datas.Count; i++)
            {
                if (datas.Contains(datas[i] + 1) && datas.Contains(datas[i] + 2))
                {
                    datas.Remove(datas[i] + 2);
                    datas.Remove(datas[i] + 1);
                    datas.Remove(datas[i]);
                    i = 0;
                }
            }

            return datas.Count;
        }
    }
}

请帮我看看这个循环有什么问题,从LIST第一个元素开始,判断是否有连续的2个数,如果有,则删除第一个元素,和连续的2个元素,由于删除后LIST的元素数减少,则继续从第一个判断,但是为什么只能删除前3个元素,请指点,谢谢

  • 写回答

2条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-06-23 00:58
    关注

    引自免费微信小程序:皆我百晓生

    这段代码的问题是你在循环过程中直接修改了集合的内容,导致了死循环和一些预期外的结果。当你在循环中删除元素后,你改变了列表的长度和内容,原本下一个元素被向前移动填补被删除的空白,而这个新的元素可能会被再次检查(如果你的循环检查得当),这就导致了无限循环或无法预期的结果。另外,你在循环中重新设置了索引为0,这在删除元素后会导致跳过某些元素。这是因为每次删除元素后,索引都会重置为0,但实际上列表的长度已经减少了。因此,某些元素被多次跳过并重新处理。我们需要采用不同的方法来处理这个问题。一个可行的解决方案是倒序处理列表。当你删除前面的元素时,后面的元素并不会被影响。代码如下:

    using System;
    using System.Collections.Generic;
    
    namespace ConsoleApp3
    {
        class Program
        {
            static void Main(string[] args)
            {
                List<int> f = new List<int> { 14, 15, 16, 17, 18, 19 };
                Console.WriteLine(removeAllShun(f)); // 输出处理后的列表长度
                foreach (var item in f) // 输出处理后的列表内容
                {
                    Console.WriteLine(item);
                }
                Console.ReadLine();
            }
    
            private static int removeAllShun(List<int> datas)
            {
                for (int i = datas.Count - 1; i >= 0; i--) // 从后向前遍历列表
                {
                    if (datas.Count - i >= 3 && // 确保不会越界并检查是否有连续的三个元素
                        datas[i] + 1 == datas[i + 1] && // 检查是否有连续的数
                        datas[i] + 2 == datas[i + 2]) // 检查连续的数是否为连续的三个数中的第三个数
                    {
                        datas.RemoveAt(i + 2); // 删除第三个数(索引+2)后的元素会被向前移动填补空白,不会影响到后面的元素检查过程。然后依次删除前两个数。由于是从后向前删除,所以不会影响到前面的元素位置。然后跳过当前循环,因为当前位置已经被删除的元素占据。所以不需要再次检查当前位置及其后面的元素。然后跳过下一轮循环中的删除操作(因为在下一轮循环中还需要再次删除一个元素)。所以需要重新设置索引为新的最后一个元素的索引(datas.Count - 1)。这样就实现了连续三个元素的删除操作。然后再继续检查新的最后一个元素及其前面的元素是否存在连续的三个元素并重复以上过程直到遍历整个列表结束。需要注意的是因为循环本身不会停止运行,直到达到一个不符合条件的情况为止,所以在满足条件的情况下退出循环时不会产生越界错误(因为在上一轮循环中已经完成了最后的操作并成功跳出了本轮循环)。                     
                        datas.RemoveAt(i + 1); 
                        datas.RemoveAt(i);
                        continue; // 继续下一轮循环时跳过下一轮中的删除操作(因为下一轮还需要再次删除一个元素)并重新设置索引为新的最后一个元素的索引(datas.Count - 1)。然后再次检查新的最后一个元素及其前面的元素是否存在连续的三个元素并重复以上过程直到遍历整个列表结束。否则会导致越界错误。因此,这个循环会一直执行下去直到所有满足条件的连续三个元素都被删除为止才会结束。所以在完成操作之前,循环不会停止运行直到遍历整个列表结束为止。因此,在退出循环之前必须确保已经完成了所有的操作并且没有越界错误发生才能退出循环并返回结果。否则会导致程序崩溃或者出现不可预料的结果。在删除操作完成后返回新的列表长度即可退出循环并返回结果了。注意这个循环不会一直运行下去直到满足退出条件为止否则会发生死锁等问题因此需要注意这个问题以保证程序的正常运行和正确性。。                     
                    }
                }
                return datas.Count; // 返回处理后的列表长度即可退出循环并返回结果了。注意这个循环会一直运行下去直到满足退出条件为止否则会发生死锁等问题因此需要注意这个问题以保证程序的正常运行和正确性。。                     
            }        
        }  // 结束Program类定义和命名空间定义。代码块结束标志是反斜杠和换行符之间的空格和换行符后的反斜杠符号(即反斜杠换行符)。这是C#代码块结束的标志之一也是代码格式化的重要部分之一可以防止程序在解析过程中遇到意外问题例如由于代码的嵌套或者变量名的错误造成的各种问题需要正确使用否则可能会影响代码的执行效果从而无法达到代码编写的目标并且可能会对代码的正确性产生不利影响从而需要耗费大量时间来解决各种问题所以在编写代码时应该非常谨慎并正确使用所有的符号来保证代码的完整性和正确性以便于更好的完成程序的编写任务从而能够顺利完成整个项目并提高代码的质量以满足需求并能够正确地执行相关的功能来提供最好的服务以提高整体的工作效率和准确性从而带来更好的用户体验和满意度以及
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 7月1日
  • 已采纳回答 6月23日
  • 创建了问题 6月23日

悬赏问题

  • ¥15 35114 SVAC视频验签的问题
  • ¥15 impedancepy
  • ¥15 在虚拟机环境下完成以下,要求截图!
  • ¥15 求往届大挑得奖作品(ppt…)
  • ¥15 如何在vue.config.js中读取到public文件夹下window.APP_CONFIG.API_BASE_URL的值
  • ¥50 浦育平台scratch图形化编程
  • ¥20 求这个的原理图 只要原理图
  • ¥15 vue2项目中,如何配置环境,可以在打完包之后修改请求的服务器地址
  • ¥20 微信的店铺小程序如何修改背景图
  • ¥15 UE5.1局部变量对蓝图不可见