首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从datatable中删除重复项的最佳方法是什么?

从datatable中删除重复项的最佳方法是什么?
EN

Stack Overflow用户
提问于 2008-12-04 11:05:00
回答 12查看 34.8K关注 0票数 8

我已经检查了整个网站,并在网上搜索,但没有找到一个简单的解决方案,这个问题。

我有一个datatable,它有大约20列和10K行。我需要根据4个键列删除datatable中重复的行。.Net没有这样的函数吗?与我所寻找的最接近的函数是datatable.DefaultView.ToTable(是的,要显示的列数组),但是这个函数在all上做了一个不同的操作。

如果有人能帮我做这件事就太好了。

编辑:很抱歉我对此不太清楚。此datatable是通过读取CSV文件而不是从DB创建的。因此,使用SQL查询不是一个选项。

EN

回答 12

Stack Overflow用户

回答已采纳

发布于 2008-12-04 11:19:23

您可以将Linq用于数据集。检查。就像这样:

代码语言:javascript
复制
// 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"));
}
票数 9
EN

Stack Overflow用户

发布于 2008-12-04 11:13:34

如何删除重复行?。(调整查询以连接4个键列)

编辑:使用您的新信息,我相信最简单的方法是实现IEqualityComparer并在数据行上使用Distinct。否则,如果您使用的是IEnumerable/IList而不是DataTable/DataRow,那么当然可以使用一些LINQ功夫。

编辑:示例IEqualityComparer

代码语言:javascript
复制
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.
    }
}

你可以这样使用它:

代码语言:javascript
复制
var uniqueRows = myTable.AsEnumerable().Distinct(MyRowComparer);
票数 8
EN

Stack Overflow用户

发布于 2008-12-04 11:17:53

如果您能够访问Linq,我认为您应该能够在内存集合上使用内置组功能,并选择重复的行。

搜索Google查找Linq的示例

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/340223

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档