从DataTable中删除存在于另一个DataTable中的重复条目?

时间:2009-07-22 00:07:05

标签: c#

你认为这很简单,这不是一件简单的事吗?我想要做的就是删除一些重复的行。我显然可以将PK保存到一个单独的列表中,并通过迭代来删除行,这可能就是我最终要做的事情。我觉得这里似乎缺少一些明显的解决方案。

        foreach (var v in FinalData.Visitors)
        {
            bool isDup = (AlreadyCommittedData.Visitors.Any(vdup => vdup.vid == v.vid));
            if (isDup)
            {
                v.Delete();
            }
        }

失败,'foreach集合被修改枚举操作可能无法执行'

两分钟后用谷歌搜索...我的第二次尝试就像是......

        var vDup = new LMDB.VisitorsDataTable();

        foreach (var v in FinalData.Visitors)
        {
            bool isDup = (AlreadyCommittedData.Visitors.Any(vdup => vdup.vid == v.vid));
            if (isDup)
            {
                vDup.AddVisitorRow(v);
            }
        }
        foreach (var v in vDup)
        {
            FinalData.Visitors.Remove(v);
        }

给我一个错误,比如......行存在于另一个表中

我的第三次尝试是简单的暴力;)由于副本都在前面,它实际上可能表现得很好。

//仍在测试中,可能会有拼写错误,如果有,请忽略它。             bool allDone;

        do
        {
            allDone = true;
            foreach (var v in FinalData.Visitors)
            {
                bool isDup = (AlreadyCommittedData.Visitors.Any(vdup => vdup.vid == v.vid));
                if (isDup)
                {
                    v.Delete();
                    allDone = false;
                    break;
                }
            }

        }
        while (!allDone);

2 个答案:

答案 0 :(得分:1)

我认为你的第二个选择是正确的。但是,该行可能永远不会同时在多个表中。声明vdup为列表<LMDB.VisitorsDataRow&gt;。

答案 1 :(得分:1)

假设您有两个数据表(dtA和dtB),您希望获取A中尚未包含在B中的所有记录。为此,请将表A合并到表B中,如下所示:

dtB.Merge(dtA);
dtA = dtB.GetChanges(); // this will give you records unique to table A
// optional:
dtB.RejectChanges(); // restore dtB to its original state