DataTable单列值比对问题:查找重复name行未生效
问题分析与解决方案
嘿,我一眼就瞅出你代码里的关键问题啦!你写的筛选条件dataRow["name"] == dataRow["name"]完全起不到筛选重复行的作用——每一行的name和自己比肯定都是相等的,所以所有行都被一股脑捞进新表了,这就是为啥返回的表和原表一模一样。
要找出name列重复的行,得换个思路:先确定哪些name值是重复出现的,再把所有包含这些name的行筛选出来。具体可以这么做:
- 第一步:对原表的行按name列分组,统计每个name出现的次数,把出现次数大于1的name值收集起来。
- 第二步:从原表中筛选出name属于上述重复集合的行,添加到新表中。
修改后的代码如下:
private DataTable MatcherTable(DataTable table) { DataTable match = table.Clone(); // 先找出所有重复出现的name值 var duplicateNames = table.Rows.Cast<DataRow>() .GroupBy(row => row["name"]) .Where(group => group.Count() > 1) .Select(group => group.Key) .ToList(); // 筛选出所有包含重复name的行 var duplicateRows = table.Rows.Cast<DataRow>() .Where(row => duplicateNames.Contains(row["name"])) .ToList(); foreach (var row in duplicateRows) { match.Rows.Add(row.ItemArray); } return match; }
另外补充个小细节:如果你的name列可能存在DBNull(空值),可以在分组的时候处理一下,避免潜在的异常:
var duplicateNames = table.Rows.Cast<DataRow>() .GroupBy(row => row["name"] ?? DBNull.Value) // 处理空值情况 .Where(group => group.Count() > 1) .Select(group => group.Key) .ToList();
这样就能准确把所有name重复的行提取到新表中啦!
内容的提问来源于stack exchange,提问作者Jacob
相关产品推荐
相关产品推荐

