Kha*_*din 7 c# datatable duplicates
我检查了整个网站并在网上搜索,但无法找到解决此问题的简单方法.
我有一个大约有20列和10K行的数据表.我需要根据4个键列删除此数据表中的重复行.不.Net有这样的功能吗?最接近我正在寻找的函数是datatable.DefaultView.ToTable(true,要显示的列数组),但是这个函数在所有列上都是不同的.
如果有人可以帮助我,这将是很好的.
编辑:对不起,我很抱歉.通过读取CSV文件而不是数据库来创建此数据表.因此,使用SQL查询不是一种选择.
您可以使用Linq到数据集.检查一下.像这样的东西:
// Fill the DataSet.
DataSet ds = new DataSet();
ds.Locale = CultureInfo.InvariantCulture;
FillDataSet(ds);
List<DataRow> rows = new List<DataRow>();
DataTable contact = ds.Tables["Contact"];
// Get 100 rows from the Contact table.
IEnumerable<DataRow> query = (from c in contact.AsEnumerable()
select c).Take(100);
DataTable contactsTableWith100Rows = query.CopyToDataTable();
// Add 100 rows to the list.
foreach (DataRow row in contactsTableWith100Rows.Rows)
rows.Add(row);
// Create duplicate rows by adding the same 100 rows to the list.
foreach (DataRow row in contactsTableWith100Rows.Rows)
rows.Add(row);
DataTable table =
System.Data.DataTableExtensions.CopyToDataTable<DataRow>(rows);
// Find the unique contacts in the table.
IEnumerable<DataRow> uniqueContacts =
table.AsEnumerable().Distinct(DataRowComparer.Default);
Console.WriteLine("Unique contacts:");
foreach (DataRow uniqueContact in uniqueContacts)
{
Console.WriteLine(uniqueContact.Field<Int32>("ContactID"));
}
Run Code Online (Sandbox Code Playgroud)
如何删除重复的行?.(调整那里的查询以加入4个关键列)
编辑:使用您的新信息我相信最简单的方法是实现IEqualityComparer <T>并在数据行上使用Distinct.否则,如果你正在使用IEnumerable/IList而不是DataTable/DataRow,那么一些LINQ-to-objects kung-fu肯定是可能的.
编辑:示例IEqualityComparer
public class MyRowComparer : IEqualityComparer<DataRow>
{
public bool Equals(DataRow x, DataRow y)
{
return (x.Field<int>("ID") == y.Field<int>("ID")) &&
string.Compare(x.Field<string>("Name"), y.Field<string>("Name"), true) == 0 &&
... // extend this to include all your 4 keys...
}
public int GetHashCode(DataRow obj)
{
return obj.Field<int>("ID").GetHashCode() ^ obj.Field<string>("Name").GetHashCode() etc.
}
}
Run Code Online (Sandbox Code Playgroud)
你可以像这样使用它:
var uniqueRows = myTable.AsEnumerable().Distinct(MyRowComparer);
Run Code Online (Sandbox Code Playgroud)