如何基于List<int>移除自定义List<Info>中的指定项?
解决方法:过滤List中Code匹配指定int列表的项
嘿,我来帮你搞定这个问题!你遇到的核心问题其实是两个集合的类型不匹配(Info.Code是string类型,而ids是int类型),还有对RemoveAll的用法有点误解,我给你梳理几个简洁靠谱的实现方式:
先明确核心问题
你之前的代码有两个小问题:
- 类型不匹配:直接用
i == x.Code会编译报错,因为int和string不能直接比较; RemoveAll的返回值误解:RemoveAll返回的是被移除的元素数量,不是新的列表,不能直接赋值给List<Info>变量。
方法1:高效过滤生成新列表(推荐)
如果你的Info.Code都是合法的整数字符串,最简洁高效的方式是先把ids转换成字符串集合(用HashSet提升查找速度),再用Where过滤:
// 把int列表转成HashSet<string>,Contains操作是O(1),比List的Any快很多 var idStringSet = new HashSet<string>(ids.Select(id => id.ToString())); // 过滤掉Code在集合中的项,生成新列表 var filteredInfos = info.Where(item => !idStringSet.Contains(item.Code)).ToList();
如果Info.Code可能存在非整数的情况,需要加转换校验:
var filteredInfos = info.Where(item => { // 尝试把Code转成int,失败则保留该元素 if (int.TryParse(item.Code, out var codeInt)) return !ids.Contains(codeInt); return true; }).ToList();
方法2:修正RemoveAll的用法(修改原列表的场景)
如果你确实需要修改原列表(或者复制后的列表),可以这样写:
// 先复制原列表,避免修改原始数据 var test = new List<Info>(info); // 移除匹配的项,返回值是移除的数量 int removedCount = test.RemoveAll(item => { int codeInt; return int.TryParse(item.Code, out codeInt) && ids.Contains(codeInt); });
为什么Except不适合这里?
Except方法要求两个集合的元素类型一致,并且默认会按对象的引用(或重写的Equals/GetHashCode)来比较,没办法直接基于Code属性做过滤,所以确实不是这个场景的最优解。
内容的提问来源于stack exchange,提问作者the_tr00per
相关产品推荐
相关产品推荐

