使用LINQ移除DataTable所有重复项且不保留任何重复条目
实现方法
你当前的逻辑是分组后取每组第一条,本质是「重复项去重留一」。要实现「所有存在重复的记录全部删除、仅保留完全无重复的条目」,只需要在分组后增加筛选条件,只保留组内记录数为1的分组即可。
对应修改后的代码如下:
Dt1 = Dt1.AsEnumerable() .GroupBy(r => new { filename = r.Field<string>("filename1"), filesize = r.Field<string>("filesizeinkb") }) .Where(g => g.Count() == 1) .Select(g => g.First()) .CopyToDataTable();
效果说明
针对你给出的测试样例:
- 分组键为
Fileone + 50的分组共包含2条记录,会被整条过滤,组内的两条记录都不会保留 - 分组键为
Filetwo + 50、Filethree + 50的分组各只有1条记录,会被正常保留
最终输出结果仅包含Name为Three、Four的两行数据,完全匹配预期需求。
边界情况兼容
如果存在过滤后无符合条件记录的场景,直接调用CopyToDataTable()会抛出异常,可以提前做判断兼容:
var validRows = Dt1.AsEnumerable() .GroupBy(r => new { filename = r.Field<string>("filename1"), filesize = r.Field<string>("filesizeinkb") }) .Where(g => g.Count() == 1) .Select(g => g.First()); Dt1 = validRows.Any() ? validRows.CopyToDataTable() : Dt1.Clone();
内容的提问来源于stack exchange,提问作者Raphael Rieber
相关产品推荐
相关产品推荐

