为什么C# List过滤不含Test字符串项时索引0的元素未被移除?
核心原因
你编写的代码存在两处逻辑问题,共同导致了索引为0的元素未被移除:
- 循环终止条件错误:for循环的判断逻辑为
i > 0,意味着当i递减到0时会直接终止循环,索引为0的元素永远不会进入是否包含Test的校验逻辑,自然不会被移除。 - 最外层判断冗余且有逻辑漏洞:
if (g.Count > 1)会导致当列表初始元素数小于等于1时,整个过滤逻辑完全不执行,仅有的元素不会被任何校验处理。 - 你提到的「复制原List」操作实际未生效:List属于C#中的引用类型,直接写
var g = urls只是把urls的内存地址赋值给了g,两个变量指向同一个List实例,对g做增删操作时原urls也会同步被修改,要生成独立副本需要写var g = urls.ToList()或者var g = new List<string>(urls)。
修复方案
方案1:修改原有遍历删除逻辑
// 先复制得到独立的List副本 var g = urls.ToList(); // 移除冗余的Count判断,修改循环终止条件为i>=0 for(int i = g.Count - 1; i >= 0; i--) { if (!g[i].Contains("Test")) { g.RemoveAt(i); } }
方案2:使用LINQ简化过滤
如果不需要保留遍历删除的写法,可以直接用LINQ方法实现过滤,代码更简洁易读:
var g = urls.Where(item => item.Contains("Test")).ToList();
内容的提问来源于stack exchange,提问作者Daniel Lip
相关产品推荐
相关产品推荐

