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

C#循环移除数组含指定关键词元素时遇索引越界异常求助

解决数组过滤时的索引越界问题

我来帮你分析下问题出在哪,然后给出修复后的代码~

问题根源

  • 索引越界的核心原因:你在foreach遍历files数组的过程中,直接替换了files的引用(通过files = files.Where(...).ToArray()生成了新数组),但num变量还在持续递增。当原数组的元素被移除后,新数组的长度变短,此时num的值很容易超过新数组的最大索引,访问files[num]自然就会抛出索引越界异常。
  • 逻辑偏差:你的过滤条件写的是val != numToRemove,但实际需求是移除包含特定关键词的元素,不是移除等于关键词的元素,这会导致最终的过滤结果完全不符合预期。

修复后的代码

这里提供两种简洁且安全的实现方式,你可以根据场景选择:

方式一:用Linq一次性完成过滤(推荐简单场景)

不需要在遍历中修改原数组,直接通过Linq链式调用一次性完成所有过滤逻辑:

string[] files = { "image4.png", "copy.psd", "image3.jpg", "image1.png", "image2.png" };
string[] namesArray = Console.ReadLine().Split(',');

// 过滤掉包含任意关键词的元素
files = files.Where(file => !namesArray.Any(keyword => file.Contains(keyword))).ToArray();

// 输出验证结果
foreach (string file in files)
{
    Console.WriteLine(file);
}

方式二:用List实现动态删除(适合需要额外操作的场景)

如果需要在删除元素前后执行更多自定义逻辑,推荐使用List<string>,并通过反向遍历避免索引混乱:

List<string> filesList = new List<string> { "image4.png", "copy.psd", "image3.jpg", "image1.png", "image2.png" };
string[] namesArray = Console.ReadLine().Split(',');

// 反向遍历列表,避免删除元素导致的索引偏移
for (int i = filesList.Count - 1; i >= 0; i--)
{
    string file = filesList[i];
    Console.WriteLine(file);
    if (namesArray.Any(keyword => file.Contains(keyword)))
    {
        Console.WriteLine("exist");
        filesList.RemoveAt(i);
    }
}

// 如果需要转回数组,执行下面的代码
string[] files = filesList.ToArray();

小提示

  • 第一种方式代码简洁易读,适合只需要单纯过滤的场景。
  • 第二种方式更灵活,能在删除元素前后轻松添加额外的业务逻辑,反向遍历的思路也能避免正向删除时的索引错位问题。

内容的提问来源于stack exchange,提问作者user78430

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 15:57:53