【问题标题】:compare all rows in DataTable - identify duplicate records比较 DataTable 中的所有行 - 识别重复记录
【发布时间】:2010-10-14 10:08:35
【问题描述】:

我想在没有密钥的情况下规范化 DataTable insertRows 中的数据。为此,我需要通过查找其 ID (import_id) 来识别和标记重复记录。之后,我将只选择不同的。我正在考虑的方法是将每一行与该 DataTable insertRows 中的所有行进行比较@

DataTable 中的列在设计时是未知的,并且没有键。在性能方面,该表将有多达 10k 到 20k 条记录和大约 40 列

如何在不牺牲太多性能的情况下实现这一点?

我尝试使用 linq,但我不知道如何动态指定 where 条件 在这里,我在循环中比较每一行的名字和姓氏

foreach (System.Data.DataRow lrows in importDataTable.Rows)
{
    IEnumerable<System.Data.DataRow> insertRows = importDataTable.Rows.Cast<System.Data.DataRow>();

    var col_matches =
    from irows in insertRows
    where
    String.Compare(irows["fname"].ToString(), lrows["fname"].ToString(), true).Equals(0)
    &&
    String.Compare(irows["last_name"].ToString(), lrows["last_name"].ToString(),true).Equals(0)

    select new { import_id = irows["import_id"].ToString() };
}

欢迎任何想法。 如何使用 linq 找到类似的列名?>我的类似问题

【问题讨论】:

  • 请编辑问题并取消选中“社区维基”
  • 这篇文章没有获得任何投票的原因是因为它是社区维基吗?
  • 我无法取消选中 wiki。对不起

标签: c# .net asp.net linq normalization


【解决方案1】:

在没有 O(n2) 复杂度的情况下完成此操作的最简单方法是使用有效实现 Set 操作的数据结构,特别是 Contains 操作。幸运的是 .NET(从 3.0 开始)包含 HashSet 对象,它可以为您执行此操作。为了利用这一点,您将需要一个在 DataTable 中封装一行的对象。

如果 DataRow 不起作用,我建议将相关记录转换为字符串,将它们连接起来,然后将它们放入 HashSet。在插入行之前,请检查 HashSet 是否已经包含它(使用 Contains)。如果是这样,则您找到了重复项。

编辑:

这个方法是O(n)。

【讨论】:

    【解决方案2】:

    我对 LINQ 不太了解,但你能使用 .Distinct() 运算符吗?

    http://blogs.msdn.com/charlie/archive/2006/11/19/linq-farm-group-and-distinct.aspx

    您的问题并不清楚您是否需要专门识别重复的行,或者您是否只是想从查询中删除它们。添加“Distinct”会删除额外的实例,尽管它不一定会告诉你它们是什么。

    【讨论】:

    • 我正在寻找识别行 - 我编辑了问题以反映这一点。
    【解决方案3】:

    我不确定我是否正确理解了这个问题,但是在处理 System.Data.DataTable 时,以下应该可以工作。

    for (Int32 r0 = 0; r0 < dataTable.Rows.Count; r0++)
    {
       for (Int32 r1 = r0 + 1; r1 < dataTable.Rows.Count; r1++)
       {
          Boolean rowsEqual = true;
    
          for (Int32 c = 0; c < dataTable.Columns.Count; c++)
          {
             if (!Object.Equals(dataTable.Rows[r0][c], dataTable.Rows[r1][c])
             {
                rowsEqual = false;
                break;
             }
          }
    
          if (rowsEqual)
          {
             Console.WriteLine(
                String.Format("Row {0} is a duplicate of row {1}.", r0, r1))
          }
       }
    }
    

    【讨论】:

    • 我已经实现了这个方法,它确实完成了我在这里的要求。谢谢!我正在继续寻找一种使用更便宜的方法的解决方案。
    猜你喜欢
    • 2021-12-16
    • 1970-01-01
    • 2020-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-05
    • 1970-01-01
    相关资源
    最近更新 更多