You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为什么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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 20:45:03