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

如何基于List<int>移除自定义List<Info>中的指定项?

解决方法:过滤List中Code匹配指定int列表的项

嘿,我来帮你搞定这个问题!你遇到的核心问题其实是两个集合的类型不匹配(Info.Code是string类型,而ids是int类型),还有对RemoveAll的用法有点误解,我给你梳理几个简洁靠谱的实现方式:

先明确核心问题

你之前的代码有两个小问题:

  1. 类型不匹配:直接用i == x.Code会编译报错,因为int和string不能直接比较;
  2. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:47:13