比较C#中的两个数据表 [英] Compare two datatables in C#
本文介绍了比较C#中的两个数据表的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我有两个数据表,我需要比较两列并删除一些结果。
datatable 1
ID CODNº字母
83 65 0 abc
21 28 0 abc
12 32 3 asd
12 55 8 asd
datatable 2
ID DETAIL
15 33
21 2
12 3
i需要比较数据表1和数据表2的列ID并获得一个新的数据表结果:
datatable 3
ID DETAILCODNº字母
21 2 28 0 abc
12 3 32 3 asd
12 3 55 8 asd
我尝试了什么:
c#,linq and for,foreach和其他提示...
var filter =来自dsAsEnumerable()中的firstDt!(来自dsDC.AsEnumerable()中的secondDt选择secondDt [ID])。包含(firstDt [ID]。ToString() )
选择firstDt;
DataTable resultDt = filter.CopyToDataTable();
解决方案
看起来像一个简单的嵌套循环:
foreach () // 循环遍历table2的所有行并获取ID(ID_2)
{
foreach () // 循环遍历table1的所有行并获取ID(ID_1)
{
if (ID_2 == ID_1)
// 在table3中写下这一行
}
}
< blockquote>尝试
使用System.Data;
使用System.Linq;
命名空间ConsoleApplication1
{
class程序
{
static void Main(string [] args)
{
DataTable dt1 = new DataTable();
dt1.Columns.Add(ID);
dt1.Columns.Add(COD);
dt1.Columns.Add(No);
dt1.Columns.Add(letter);
dt1.Rows.Add(83,65,0,abc);
dt1.Rows.Add(21,28,0,abc);
dt1.Rows.Add(12,32,3,asd);
dt1.Rows.Add(12,55,88,asd);
DataTable dt2 = new DataTable();
dt2.Columns.Add(ID);
dt2.Columns.Add(DETAIL);
dt2.Rows.Add(15,33);
dt2.Rows.Add(21,2);
dt2.Rows.Add(12,3);
DataTable dtFinal = dt1.Clone();
dtFinal.Columns.Add(DETAIL);
foreach(dt1.Rows中的DataRow行)
{
DataRow [] rowsTarget = dt2.Select(string.Format(ID = {0},row [ID]) );
if(rowsTarget!= null&& rowsTarget.Length> 0)
{
string detail = rowsTarget [0] [DETAIL]。ToString();
var lst = row.ItemArray.ToList();
lst.Add(详情);
dtFinal.Rows.Add(lst.ToArray());
}
}
}
}
}
这是解决方案2的修改版本,有两个示例,第一个使用
Linq
fluent语法,第二个使用查询语法。private static void Main( string [] args)
{
var dt1 = new DataTable();
dt1.Columns.Add( ID, typeof ( long ));
dt1.Columns.Add( COD, typeof ( int ));
dt1.Columns.Add( No, typeof ( int ));
dt1.Columns.Add( letter, typeof ( string ));
dt1.Rows.Add( 83 , 65 , 0 , abc);
dt1.Rows.Add( 21 , 28 , 0 , abc);
dt1.Rows.Add( 12 , 32 , 3 , asd);
dt1.Rows.Add( 12 , 55 , 88 , asd);
var dt2 = new DataTable();
dt2.Columns.Add( ID, typeof ( long ));
dt2.Columns.Add( DETAIL, typeof ( string ));
dt2.Rows.Add( 15 , 33 );
dt2.Rows.Add( 21 , 2 );
dt2.Rows.Add( 12 , 3 );
DataTable dtTemp = dt1.Clone();
dtTemp.Columns.Add( DETAIL);
DataTable resultDataTable =
dt1.AsEnumerable()
.Join(
dt2.AsEnumerable(),
f = > f.Field< long>( ID),
s = > s.Field< long>( ID),
(f,s)= > new {f,s})
。选择(
a = >
dtTemp.LoadDataRow(
new object []
{
afField< long>( ID),
afField< int>( COD),
afField< int>(< span class =code-string> No),
afField< string>( 字母),
asField< string>( DETAIL)
},
false ))
.CopyToDataTable ();
// 使用查询语法
DataTable resultDataTable2 =(来自 dataRows1 in dt1.AsEnumerable()
join dataRows2 in dt2.AsEnumerable()
on dataRows1.Field< long>( ID)等于dataRows2.Field< long>( ID )
选择
dtTemp.LoadDataRow(
new object []
{
dataRows1.Field< long>( < span class =code-string> ID),
dataRows1.Field< int>( COD),
dataRows1.Field< int>( 否),
dataRows1.Field< string>( letter),
dataRows2.Field< string>( 详情)
},
false ))。CopyToDataTable();
}
I have two datatables and i need to compare two columns and delete some results .
datatable 1
ID COD Nº letter
83 65 0 abc
21 28 0 abc
12 32 3 asd
12 55 8 asd
datatable 2
ID DETAIL
15 33
21 2
12 3
i need to compare column ID of datatable 1 and datatable 2 and get in a new datatable the result:
datatable 3
ID DETAIL COD Nº letter
21 2 28 0 abc
12 3 32 3 asd
12 3 55 8 asd
What I have tried:
c#, linq and for, foreach and other tips...
var filter = from firstDt in ds.AsEnumerable()where !(from secondDt in dsDC.AsEnumerable() select secondDt["ID"]).Contains(firstDt["ID"].ToString()) select firstDt; DataTable resultDt = filter.CopyToDataTable();
解决方案
Looks like a simple nested loop that you need:
foreach() // loop over all rows of the table2 and get ID (ID_2) { foreach() // loop over all rows of the table1 and get ID (ID_1) { if (ID_2 == ID_1) // write this row in the table3 } }
try
using System.Data; using System.Linq; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { DataTable dt1 = new DataTable(); dt1.Columns.Add("ID"); dt1.Columns.Add("COD"); dt1.Columns.Add("No"); dt1.Columns.Add("letter"); dt1.Rows.Add(83, 65, 0, "abc"); dt1.Rows.Add(21, 28, 0, "abc"); dt1.Rows.Add(12, 32, 3, "asd"); dt1.Rows.Add(12, 55, 88, "asd"); DataTable dt2 = new DataTable(); dt2.Columns.Add("ID"); dt2.Columns.Add("DETAIL"); dt2.Rows.Add(15, 33); dt2.Rows.Add(21, 2); dt2.Rows.Add(12, 3); DataTable dtFinal = dt1.Clone(); dtFinal.Columns.Add("DETAIL"); foreach (DataRow row in dt1.Rows) { DataRow[] rowsTarget = dt2.Select(string.Format("ID={0}",row["ID"])); if (rowsTarget != null && rowsTarget.Length > 0) { string detail = rowsTarget[0]["DETAIL"].ToString(); var lst = row.ItemArray.ToList(); lst.Add(detail); dtFinal.Rows.Add(lst.ToArray()); } } } } }
This is a modified version of solution 2 with two examples, the first uses
Linq
fluent syntax and the second uses query syntax.private static void Main(string[] args) { var dt1 = new DataTable(); dt1.Columns.Add("ID", typeof(long)); dt1.Columns.Add("COD", typeof(int)); dt1.Columns.Add("No", typeof(int)); dt1.Columns.Add("letter", typeof(string)); dt1.Rows.Add(83, 65, 0, "abc"); dt1.Rows.Add(21, 28, 0, "abc"); dt1.Rows.Add(12, 32, 3, "asd"); dt1.Rows.Add(12, 55, 88, "asd"); var dt2 = new DataTable(); dt2.Columns.Add("ID", typeof(long)); dt2.Columns.Add("DETAIL", typeof(string)); dt2.Rows.Add(15, 33); dt2.Rows.Add(21, 2); dt2.Rows.Add(12, 3); DataTable dtTemp = dt1.Clone(); dtTemp.Columns.Add("DETAIL"); DataTable resultDataTable = dt1.AsEnumerable() .Join( dt2.AsEnumerable(), f => f.Field<long>("ID"), s => s.Field<long>("ID"), (f, s) => new { f, s }) .Select( a => dtTemp.LoadDataRow( new object[] { a.f.Field<long>("ID"), a.f.Field<int>("COD"), a.f.Field<int>("No"), a.f.Field<string>("letter"), a.s.Field<string>("DETAIL") }, false)) .CopyToDataTable(); //using query syntax DataTable resultDataTable2 = (from dataRows1 in dt1.AsEnumerable() join dataRows2 in dt2.AsEnumerable() on dataRows1.Field<long>("ID") equals dataRows2.Field<long>("ID") select dtTemp.LoadDataRow( new object[] { dataRows1.Field<long>("ID"), dataRows1.Field<int>("COD"), dataRows1.Field<int>("No"), dataRows1.Field<string>("letter"), dataRows2.Field<string>("DETAIL") }, false)).CopyToDataTable(); }
这篇关于比较C#中的两个数据表的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文