如何比较2个数据表并在C#中返回重复值 [英] How to compare 2 data tables and return duplicate values in C#

查看:93
本文介绍了如何比较2个数据表并在C#中返回重复值的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个要求,其中我有两个数据表,两个都有不同的列集,行是动态的。我想将一个数据表的第5列中的值与第二个数据表中的第4列进行比较,并返回一个仅存在匹配值的新数据表。



数据表是system.Data.Datatable



我是一个完整的初学者,你的帮助对我来说很棒。



数据表1如下所示



I have a requirement in which i have two datatables, both with different sets of columns, rows are dynamic. I want to compare the values in 5th column of one datatable with the 4th column on the 2nd Datatable and return a new data table on which only the matched values are present.

The data tables are system.Data.Datatable

I am a complete beginner and your help will be great for me.

Data Table 1 looks like below

xxyy    2   Enjoy 2000 MB                      xxyy 88035
yyxx    2   Enjoy 250 Minutes                  yyxx 88039
yyxx    2   Get 1 GB Data, valid for 3 day.    yyxx 88549
zzyy    2   10 GB Data   valid for 30 days.    zzyy 88535





数据表2如下





Data table 2 like below

2   Enjoy 2000 MB                      xxyy 88035 john
2   Enjoy 250 Minutes                  yyxx 88039 george
2   Get 1 GB Data, valid for 3 day.    yyxx 88612 anil
2   10 GB Data   valid for 30 days.    zzyy 88992 peter





这里,我试图比较数据表1的第5列和数据表2的第4列的值,结果应如下所示





Here, i am trying to compare the values on column 5 of data table1 and column 4 of data table 2, the result should be like below

xxyy    2   Enjoy 2000 MB        xxyy   88035
yyxx    2   Enjoy 250 Minutes    yyxx   88039



即如果值是常见的,则返回datatable1并删除唯一值。



我尝试过:



我是一个完全的初学者,不知道从哪里开始


i.e if values are common, return datatable1 with removing the unique values.

What I have tried:

I'm a complete beginner and have no idea where to start

推荐答案

使用IN子查询:



IN(Transact-SQL)| Microsoft Docs [ ^ ]
Use an "IN" sub-query:

IN (Transact-SQL) | Microsoft Docs[^]


如果您想获得匹配的记录,请使用join子句(C#参考)| Microsoft Docs [ ^ ]



例如:

If you would like to get matched records, use join clause (C# Reference) | Microsoft Docs[^]

For example:
DataTable dt1 = new DataTable();
dt1.Columns.AddRange(new DataColumn[]
	{
		new DataColumn(),
		new DataColumn(),
		new DataColumn(),
		new DataColumn(),
		new DataColumn()
	});
dt1.Rows.Add(new object[]{"xxyy", 2, "Enjoy 2000 MB", "xxyy", 88035});
dt1.Rows.Add(new object[]{"yyxx", 2, "Enjoy 250 Minutes", "yyxx", 88039});
dt1.Rows.Add(new object[]{"yyxx", 2, "Get 1 GB Data, valid for 3 day.", "yyxx", 88549});
dt1.Rows.Add(new object[]{"zzyy", 2, "10 GB Data   valid for 30 days.", "zzyy", 88535});

DataTable dt2 = new DataTable();
dt2.Columns.AddRange(new DataColumn[]
	{
		new DataColumn(),
		new DataColumn(),
		new DataColumn(),
		new DataColumn(),
		new DataColumn()
	});
dt2.Rows.Add(new object[]{2, "Enjoy 2000 MB", "xxyy", 88035, "john"});
dt2.Rows.Add(new object[]{2, "Enjoy 250 Minutes", "yyxx", 88039, "george"});
dt2.Rows.Add(new object[]{2, "Get 1 GB Data, valid for 3 day.", "yyxx", 88612, "anil"});
dt2.Rows.Add(new object[]{2, "10 GB Data   valid for 30 days.", "zzyy", 88992, "peter"});

var result = from d1 in dt1.AsEnumerable()
	join d2 in dt2.AsEnumerable() on new {A = d1[1], B = d1[4]} equals new {A = d2[0], B = d2[3]}
	select d1;
	
foreach (DataRow dr in result)
{
	Console.WriteLine("{0} {1} {2} {3} {4}", dr[0], dr[1], dr[2], dr[3], dr[4]);
}







祝你好运!




Good luck!


//clone structure of dt1 into new table to store the result
DataTable dt3 = dt1.Clone();
//find index numbers in dt1 not present in dt2
var idsExceptDt2 = dt1.AsEnumerable().Select(r => (long)r.ItemArray[4])
    .Except(dt2.AsEnumerable().Select(r => (long)r.ItemArray[3])).ToArray();

foreach (DataRow r in dt1.Rows)
  {
    //does the row index number match any of the non-duplicate index numbers?
    bool isMatched = idsExceptDt2.Any(id => (long)r.ItemArray[4] == id);
    if (!isMatched)
       {
         dt3.Rows.Add(r.ItemArray);
       }
  }


这篇关于如何比较2个数据表并在C#中返回重复值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆