我有一个从csv读取的数据表。我想做的是在标题为“ name”的一行中找到所有重复的名称,并将它们添加到另一个datable中供以后使用。我到目前为止的代码:
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;
}
但是,当我返回应该充满匹配项的表时,它返回的是我读入的完全相同的表。我缺少简单的东西吗?
创建空列表,因此您可以执行此操作
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);
}
}
我在拼写或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;
}