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

