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

如何用LINQ查询找出DataTable中工号重复但用户名不同的数据?

解决DataTable筛选工号重复且用户名不同记录的LINQ方案

我来帮你搞定这个问题!你需要的是从DataTable里找出工号重复但对应用户名不唯一的记录,然后按指定格式输出。之前的LINQ没得到结果,大概率是没加对筛选条件——不仅要工号重复,还要组内的用户名存在差异。

完整实现代码

假设你的DataTable名为mergedDt,列名和你描述的一致("Worknumber(工号)"和"Username(用户名)"),可以用下面的LINQ查询:

// 1. 按工号分组,筛选出符合条件的组
var targetGroups = mergedDt.AsEnumerable()
    .GroupBy(row => row.Field<string>("Worknumber(工号)"))
    .Where(group => 
        group.Count() > 1 // 工号有重复记录
        && group.Select(r => r.Field<string>("Username(用户名)")).Distinct().Count() > 1); // 组内用户名不唯一

// 2. 遍历组,按指定格式输出
foreach (var group in targetGroups)
{
    var worknumber = group.Key;
    // 拼接去重后的用户名(避免重复输出同一用户名)
    var usernameStr = string.Join(" ", group.Select(r => r.Field<string>("Username(用户名)")).Distinct());
    Console.WriteLine($"{worknumber} {usernameStr}");
}

代码解释

  1. AsEnumerable():把DataTable转换为支持LINQ查询的IEnumerable<DataRow>集合,这是对DataTable使用LINQ的前提。
  2. GroupBy(row => row.Field<string>("Worknumber(工号)")):将所有记录按工号分组,同一个工号的记录会被归为一组。
  3. Where筛选条件:
    • group.Count() > 1:确保该工号存在多条记录(即工号重复);
    • group.Select(r => r.Field<string>("Username(用户名)")).Distinct().Count() > 1:确保组内的用户名去重后数量大于1,也就是存在不同的用户名(排除像1235那样工号重复但用户名完全相同的情况)。
  4. 输出处理:用Distinct()去重用户名(如果同个工号下有重复的用户名,比如1236 Donald、1236 Jack、1236 Donald,去重后只保留一次Donald),再用string.Join拼接成空格分隔的字符串,最后和工号组合输出。

注意事项

  • 确保列名完全匹配:DataTable的列名必须和你代码里写的"Worknumber(工号)"、"Username(用户名)"完全一致(包括中文、括号、大小写),否则Field<string>会抛出异常。如果你的列名是纯英文(比如"Worknumber"、"Username"),记得修改代码里的字段名。
  • 如果工号是数值类型(比如int),把row.Field<string>改成row.Field<int>即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 07:02:50