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

如何从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次,两行都会被存入duplicateRecordsTable
  • janedoe@xyz.com、janedun@xyz.com、timlastname@xyz.com各出现1次,保留在uniqueRecordsTable中,和你期望的输出完全匹配

内容的提问来源于stack exchange,提问作者mikebvs

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 10:12:56