如何使用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
相关产品推荐
相关产品推荐

