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