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

如何使用List<T>.RemoveAll简化for循环并从集合中移除元素

用C# LINQ扩展方法简化代码替代for循环

你这段代码的核心需求是移除member字段匹配指定前缀的元素,原先用从后往前的for循环来避免修改集合时的索引错乱问题,完全可以用LINQ扩展方法来简化,让代码更简洁易读。

方案一:生成新集合(推荐)

直接通过Where筛选保留需要的元素,生成新List,逻辑清晰且不修改原集合:

public class Member
{
    public string member { get; set; }
}

public class PatternMatch
{
    public static List<Member> Remove()
    {
        var prefixes = new string[] { "usa-", "o-", "a-" };

        var members = new List<Member>
        {
            new Member { member = "a-o@b.com" },
            new Member { member = "usa-b@d.com" },
            new Member { member = "c@d.com" }
        };

        // 筛选出不匹配任何前缀的元素,转成新List返回
        return members.Where(member => 
            !prefixes.Any(prefix => 
                member.member.StartsWith(prefix, StringComparison.InvariantCultureIgnoreCase)))
            .ToList();
    }
}

方案二:修改原集合

如果业务需求必须修改原集合而非生成新集合,可以用RemoveAll方法,它内部会处理集合修改的索引问题,比手动写for循环更高效:

public static List<Member> Remove()
{
    var prefixes = new string[] { "usa-", "o-", "a-" };

    var members = new List<Member>
    {
        new Member { member = "a-o@b.com" },
        new Member { member = "usa-b@d.com" },
        new Member { member = "c@d.com" }
    };

    // 一次性移除所有匹配前缀的元素
    members.RemoveAll(member => 
        prefixes.Any(prefix => 
            member.member.StartsWith(prefix, StringComparison.InvariantCultureIgnoreCase)));

    return members;
}

关键优化点

  • 用Any替代内层foreach循环,判断元素是否匹配任意前缀,代码更紧凑
  • 避免手动操作索引,消除了索引越界或漏删元素的风险
  • 集合初始化语法替代多次Add调用,简化集合创建代码

内容的提问来源于stack exchange,提问作者Tech with Thiru

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 11:09:55