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

如何使用LINQ删除DataTable1中ID不在DataTable2内的行

如何使用LINQ删除DataTable1中ID不在DataTable2内的行

嘿,我来帮你搞定这个需求!用LINQ实现这个操作思路很清晰,咱们分几步来:

首先,得把DataTable2里所有有效的NO值提取出来,存成一个高效的集合——推荐用HashSet<int>,它的Contains方法性能比普通List好太多,数据量大的时候优势特别明显:

// 提取DataTable2中的有效NO值到HashSet
var validNos = new HashSet<int>(dt2.AsEnumerable().Select(row => row.Field<int>("NO")));

接下来,用LINQ筛选出DataTable1里那些NO不在有效集合里的行。这里要注意:一定要把查询结果转成List,不能直接遍历查询结果去删除——不然会触发集合修改的异常,因为DataTable的行集合在枚举时不允许被修改:

// 筛选出要删除的行并缓存到List中
var rowsToDelete = dt1.AsEnumerable()
                      .Where(row => !validNos.Contains(row.Field<int>("NO")))
                      .ToList();

最后,批量删除这些行就搞定了:

// 循环删除选中的行
foreach (var row in rowsToDelete)
{
    dt1.Rows.Remove(row);
}

一些细节提醒:

  • 如果你的NO字段不是int类型(比如是string),记得把Field<int>改成对应的类型,比如Field<string>
  • 必须用ToList()缓存要删除的行,直接遍历LINQ查询结果删除会抛出InvalidOperationException
  • 选择HashSet而不是List存有效ID,是因为它的存在性判断是O(1)时间复杂度,数据量越大性能差异越显著

针对你给出的示例数据,执行完这段代码后,DataTable1就只会剩下NO为1、2、3的行啦。

备注:内容来源于stack exchange,提问作者Dev

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.16 09:08:00