C# 比较一个DataTable列中的值

C# 比较一个DataTable列中的值,c#,datatable,C#,Datatable,我有一个从csv读取的数据表。我想做的是在一个名为“name”的行中找到所有重复的名称,并将它们添加到另一个数据表中供以后使用。到目前为止,我掌握的代码是: private DataTable MatcherTable(DataTable table) { DataTable match = new DataTable(); match = table.Clone(); var equalRows = table.Rows.Cast&

我有一个从csv读取的数据表。我想做的是在一个名为“name”的行中找到所有重复的名称,并将它们添加到另一个数据表中供以后使用。到目前为止,我掌握的代码是:

private DataTable MatcherTable(DataTable table)
    {

        DataTable match = new DataTable();

        match = table.Clone();

        var equalRows = table.Rows.Cast<DataRow>().Where(dataRow => dataRow["name"] == dataRow["name"]).ToList();

        foreach (var equalRow in equalRows)
        {
            match.Rows.Add(equalRow.ItemArray);
        }

        return match;
    }
专用数据表匹配表(数据表)
{
DataTable match=新DataTable();
match=table.Clone();
var equalRows=table.Rows.Cast();
foreach(变量equalRow在equalRows中)
{
match.Rows.Add(equalRow.ItemArray);
}
复赛;
}

但是,当我返回应该充满匹配项的表时,它会返回与我读入的表完全相同的表。我缺少一些简单的东西吗?

创建空列表,这样你就可以这样做了

List<string> names= new List<string>();
foreach(var row in table.Rows)
{
  if(names.Contains(row["name"])
  {
  names.Add(row["name"].ToString());
  }
else
{
   DataRow dr = match.NewDataRow();
   dr.ItemArray=row.ItemArray; match.Rows.Add(dr);
}
}
列表名称=新列表();
foreach(表中的变量行。行)
{
if(names.Contains(第[“name”]行)
{
name.Add(行[“name”].ToString());
}
其他的
{
DataRow dr=match.NewDataRow();
dr.ItemArray=row.ItemArray;match.Rows.Add(dr);
}
}

我可能在拼写或smt方面有一些错误,但这只是给你一个想法!

代码只是复制输出表中的所有数据行,因为比较表达式将同一行和同一列与其自身进行比较

您可以使用单个Linq表达式来解决问题

private DataTable MatcherTable(DataTable table)
{
    DataTable match = table.Rows.Cast<DataRow>()
                           .GroupBy(x => x["Name"])
                           .Where(g => g.Count() > 1)
                           .Select(k => k.FirstOrDefault())
                           .CopyToDataTable();
    return match;
}
专用数据表匹配表(数据表)
{
DataTable match=table.Rows.Cast()
.GroupBy(x=>x[“名称”])
.Where(g=>g.Count()>1)
.Select(k=>k.FirstOrDefault())
.CopyToDataTable();
复赛;
}
在这里,我们使用Name列中的值按行分组,并筛选出发生计数小于2的所有组。接下来,我们从组中获取第一行,并构建最终复制到输出表中的Datarow序列

上面的代码将只返回重复行中的一行。如果要保留所有重复行,则需要

    DataTable match = table.Rows.Cast<DataRow>()
                           .GroupBy(x => x["Name"])
                           .Where(g => g.Count() > 1)
                           .SelectMany(k => k)
                           .CopyToDataTable();
DataTable match=table.Rows.Cast()
.GroupBy(x=>x[“名称”])
.Where(g=>g.Count()>1)
.SelectMany(k=>k)
.CopyToDataTable();

dataRow[“name”]==dataRow[“name”]您正在比较同一行中的同一列。表达式始终为True这很好!有没有办法保留重复项?我想在名称匹配的位置提取,但保留每个重复项后面列中的数据。因此,如果我有相同的名称4次,它们在后续列中的值都将不同您只需删除FirstOrDefault并将Select更改为SelectMany即可