我已经检查了整个网站,并在网上搜索,但没有找到一个简单的解决方案,这个问题。
我有一个datatable,它有大约20列和10K行。我需要根据4个键列删除datatable中重复的行。.Net没有这样的函数吗?与我所寻找的最接近的函数是datatable.DefaultView.ToTable(是的,要显示的列数组),但是这个函数在all上做了一个不同的操作。
如果有人能帮我做这件事就太好了。
编辑:很抱歉我对此不太清楚。此datatable是通过读取CSV文件而不是从DB创建的。因此,使用SQL查询不是一个选项。
发布于 2008-12-04 11:19:23
您可以将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"));
}发布于 2008-12-04 11:13:34
如何删除重复行?。(调整查询以连接4个键列)
编辑:使用您的新信息,我相信最简单的方法是实现IEqualityComparer并在数据行上使用Distinct。否则,如果您使用的是IEnumerable/IList而不是DataTable/DataRow,那么当然可以使用一些LINQ功夫。
编辑:示例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.
}
}你可以这样使用它:
var uniqueRows = myTable.AsEnumerable().Distinct(MyRowComparer);发布于 2008-12-04 11:17:53
如果您能够访问Linq,我认为您应该能够在内存集合上使用内置组功能,并选择重复的行。
搜索Google查找Linq的示例
https://stackoverflow.com/questions/340223
复制相似问题