当前位置:  开发笔记 > 编程语言 > 正文

从数据表中删除重复项的最佳方法是什么?

如何解决《从数据表中删除重复项的最佳方法是什么?》经验,为你挑选了2个好方法。

我检查了整个网站并在网上搜索,但无法找到解决此问题的简单方法.

我有一个大约有20列和10K行的数据表.我需要根据4个键列删除此数据表中的重复行.不.Net有这样的功能吗?最接近我正在寻找的函数是datatable.DefaultView.ToTable(true,要显示的列数组),但是这个函数在所有列上都是不同的.

如果有人可以帮助我,这将是很好的.

编辑:对不起,我很抱歉.通过读取CSV文件而不是数据库来创建此数据表.因此,使用SQL查询不是一种选择.



1> Eduardo Camp..:

您可以使用Linq到数据集.检查一下.像这样的东西:

// Fill the DataSet.
DataSet ds = new DataSet();
ds.Locale = CultureInfo.InvariantCulture;
FillDataSet(ds);

List rows = 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"));
}



2> liggett78..:

如何删除重复的行?.(调整那里的查询以加入4个关键列)

编辑:使用您的新信息我相信最简单的方法是实现IEqualityComparer 并在数据行上使用Distinct.否则,如果你正在使用IEnumerable/IList而不是DataTable/DataRow,那么一些LINQ-to-objects kung-fu肯定是可能的.

编辑:示例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);

推荐阅读
Life一切安好
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有