如何从DataTable中移除某列重复值的所有出现(含首次)
移除DataTable中所有重复行(含首次出现)并留存重复项的C#实现
需求说明
基于EmployeeEmail列,移除所有出现过多次的行(包括第一次出现的那条),只保留仅出现一次的记录;同时把所有重复的行(所有出现次数≥2的记录)存入另一个DataTable备用。
实现步骤
用LINQ可以高效完成这个需求,核心思路是先分组统计每个邮箱的出现次数,再分别筛选出唯一记录和重复记录:
1. 引用必要命名空间
using System; using System.Data; using System.Linq;
2. 核心代码
// 替换成你的原始DataTable实例 DataTable originalTable = GetYourSourceData(); // 按EmployeeEmail分组,统计每组的行数和对应行数据 var emailGroups = originalTable.AsEnumerable() .GroupBy(row => row.Field<string>("EmployeeEmail")) .Select(g => new { Email = g.Key, Rows = g.ToList(), OccurrenceCount = g.Count() }); // 创建仅含唯一记录的结果表(复制原表结构) DataTable uniqueRecordsTable = originalTable.Clone(); foreach (var group in emailGroups.Where(g => g.OccurrenceCount == 1)) { uniqueRecordsTable.ImportRow(group.Rows.First()); } // 创建存储所有重复记录的表(复制原表结构) DataTable duplicateRecordsTable = originalTable.Clone(); foreach (var group in emailGroups.Where(g => g.OccurrenceCount >= 2)) { foreach (var row in group.Rows) { duplicateRecordsTable.ImportRow(row); } }
代码说明
originalTable.AsEnumerable():把DataTable转为支持LINQ操作的IEnumerable<DataRow>GroupBy按邮箱分组后,通过Count()统计每个邮箱的出现次数- 筛选
OccurrenceCount == 1的分组,将其中的行导入新表,得到你需要的唯一记录结果 - 筛选
OccurrenceCount >=2的分组,把所有行导入重复表,这样就留存了所有重复的记录(包括首次出现的)
结果验证
对应你的示例数据:
johnsmith@xyz.com出现2次,两行都会被存入duplicateRecordsTablejanedoe@xyz.com、janedun@xyz.com、timlastname@xyz.com各出现1次,保留在uniqueRecordsTable中,和你期望的输出完全匹配
内容的提问来源于stack exchange,提问作者mikebvs
相关产品推荐
相关产品推荐

