比较C#中的两个数据表 [英] Compare two datatables in C#

查看:79
本文介绍了比较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屋!

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