如何比较 2 个数据表并在第 3 个数据表中获取唯一记录?

Posted

技术标签:

【中文标题】如何比较 2 个数据表并在第 3 个数据表中获取唯一记录?【英文标题】:how to compare 2 datatable and get unique records in 3rd datatable? 【发布时间】:2012-08-05 10:06:24 【问题描述】:

我有 2 个数据表,比如说 dtData1 和 dtData2。我在两个数据表中都有记录,我想比较两个数据表并想创建一个新的数据表,比如说 dtData3 和 uniqe 记录。

假设:dtData1 有 10 条记录,dtData2 有 50 条记录,但是 dtData2 中有什么记录,这 7 条记录与 dtData1 相同。所以这里我想要 dtData3 中的唯一记录,这意味着我只想要 dtData3 中的 43 条记录。

我们不知道在数据表中我们有重复的地方,我们可能不会有重复,或者我们也有可能会有所有重复的记录。

所以在 dtData3 中我需要唯一记录

请有人帮帮我。

【问题讨论】:

不是完全重复,但足够接近 - How to select distinct values from datatable? 【参考方案1】:
var dtData3 = dtData2.AsEnumerable().Except(dtData1.AsEnumerable(), DataRowComparer.Default);

【讨论】:

您确定System.Collections.IEnumerable<System.Data.DataRow> 的默认相等比较器(或.GetHashCode/.Equals-实现System.Data.DataRow)根据列的值而不是实例? From msdn.microsoft.com/en-us/library/bb386998.aspx 然后调用 Equals(DataRow, DataRow) 方法,将要比较的两个 DataRow 对象作为输入参数传入。如果两个 DataRow 对象中的有序列值集相等,则 Equals(DataRow, DataRow) 方法返回 true;否则为假。 - 这不是真的....Equals(DataRow, DataRow) 看起来不像是实例方法-是的,它不是-而是在IEqualityComparer<T> 中定义...所以,没有提供实现System.Collections.Generic.IEqualityComparer<System.Data.DataRow> 的意思是:下地狱。你必须使用以下重载:Enumerable.Except(IEnumerable<TSource>, IEnumerable<TSource>, IEqualityComparer<TSource>) (msdn.microsoft.com/en-us/library/bb336390) 比如:sequence1.Except(sequence2, System.Data.DataRowComparer.Default) - 否则你正在做一个实例/参考比较...... 请查看完整堆栈@pastebin.com/mWmJW5v5 ...应该很清楚,为什么您的解决方案失败了... “去地狱”?起名真的有必要吗?【参考方案2】:

使用这个.. 可能它会帮助你。

假设你有两个数据表

DataTable dt1 = new DataTable();
            dt1.Columns.Add("Name");
            dt1.Columns.Add("ADD");
            DataRow drow;
            for (int i = 0; i < 10; i++)
            
                drow = dt1.NewRow();
                drow[0] = "NameA" + 1;
                drow[1] = "Add" + 1;
                dt1.Rows.Add();
            
            DataTable dt2 = new DataTable();
            dt2.Columns.Add("Name");
            dt2.Columns.Add("ADD");
            DataRow drow1;
            for (int i = 0; i < 11; i++)
            
                drow1 = dt2.NewRow();
                drow1[0] = "Name" + 1;
                drow1[1] = "Add" + 1;
                dt2.Rows.Add();
            

现在来解决您的问题致电:-

DataTable d3 = CompareTwoDataTable(dt1, dt2);

方法是这样的;--

public static DataTable CompareTwoDataTable(DataTable dt1, DataTable dt2)
        
            dt1.Merge(dt2);
            DataTable d3 = dt2.GetChanges();

            return d3;
        

【讨论】:

【参考方案3】:

那么哪里需要比较dtData1dtData2呢?相反,您可以从 index7 开始将内容从 dtData2 复制到 dtData3

【讨论】:

因为我们不知道在数据表中我们有重复的位置,我们可能不会有重复的记录,也可能会有所有重复的记录。【参考方案4】:

首先创建数组变量以保存 datatable3 的唯一列值。将 Foreach 循环与第二个 gridview 行一起使用。如果任何匹配则 dnt 将其保存在数组值中,如果 dnt 匹配则将其保存在数组中。并通过附加第三个gridview来显示它......

例如

string[] name = new string[4];

int i=0,j=0;
foreach(GridViewRows gv in GridView1.rows)

    if(gv.Cells[0].Text == GridView2.Rows[i].Cells[0].Text)' //if match
    
       // dnt save
     
    else'  //if dnt match save in array for further use
    
        name[j] = gv.Cells[0].Text;
        j= j++;
    
    i=i++;

在数组“名称”中保存唯一值后...在第三个 Gridview 中绑定它 在第三个 Gridview 的 DataBound 期间添加此方法...

Private void GridView3_RowDataBound(object sender,EventArgs e)

    if(e.Row.RowState == DataControlState.DataRow)
    
        foreach(string nm in name)
        
            e.Rows.Cells.Add(name);      
        
    

【讨论】:

对不起,我是新来的..正在尝试学习如何使用..你能告诉我如何在此处的答案中发布代码...thnx 请看我的编辑 - 现在应该很清楚了......顺便说一句 - 欢迎来到社区! 对不起,我没有使用网格。 我正在从数据库中选择记录 您可以使用 sql 命令与第二个表相交,这将只选择彼此唯一的行...SELECT id FROM tab1 INTERSECT SELECT id FROM tab2阅读此示例...您的问题将解决...java2s.com/Tutorial/SQLServer/0120__Set-Operations/…跨度> 【参考方案5】:
public DataTable CompareTwoDataTable(DataTable dtOriginalTable, DataTable dtNewTable, ArrayList columnNames)
    
        DataTable filterTable = new DataTable();
        filterTable = dtNewTable.Copy();
        string filterCriterial;
        if (columnNames.Count > 0)
        
            for (int iNewTableRowCount = 0; iNewTableRowCount < dtNewTable.Rows.Count; iNewTableRowCount++)
            
                filterCriterial = string.Empty;
                foreach (string colName in columnNames.ToArray())
                
                    filterCriterial += colName.ToString() + "='" + dtNewTable.Rows[iNewTableRowCount][colName].ToString() + "' AND ";
                
                filterCriterial = filterCriterial.TrimEnd((" AND ").ToCharArray());
                DataRow[] dr = dtOriginalTable.Select(filterCriterial);
                if (dr.Length > 0)
                
                    filterTable.Rows[filterTable.Rows.IndexOf(filterTable.Select(filterCriterial)[0])].Delete();
                
            
        
        return filterTable;
    

【讨论】:

以上是关于如何比较 2 个数据表并在第 3 个数据表中获取唯一记录?的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式 - 在第 n 个空格之间匹配数据并在第 n 个空格处停止

如何比较 2 个列表并在 Python 中获取 True 或 False 列表? [复制]

使用参数重定向到 Laravel 中的控制器并在第二个控制器中获取参数

从WordPress小部件获取数据以修改帖子内容

pandas concat 2个数据框,并在合并数据中添加一列新数据。

Access - 比较两个表并在第一个表中更新或插入数据