Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/269.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从两个数据表比较返回数据表/列值_C# - Fatal编程技术网

C# 从两个数据表比较返回数据表/列值

C# 从两个数据表比较返回数据表/列值,c#,C#,My Datatable 1(dtOutput)格式(termid、faultid、faultdesc、faulttime、devicetype) My Datatable 2(dtOpenEvent)格式(termid,faultid) 我想根据两列(termid,faultid)检索Datatable 2中存在但Datatable 1中不存在的值。没有任何表具有主键 我在网上搜索,找到了返回两个数据表之间差异的代码 现在如何从中检索列值?在另一个数据表或字符串变量中 代码:- DataTab

My Datatable 1(dtOutput)格式
(termid、faultid、faultdesc、faulttime、devicetype)

My Datatable 2(dtOpenEvent)格式
(termid,faultid)

我想根据两列
(termid,faultid)
检索Datatable 2中存在但Datatable 1中不存在的值。没有任何表具有主键

我在网上搜索,找到了返回两个数据表之间差异的代码

现在如何从中检索列值?在另一个数据表或字符串变量中

代码:-

DataTable dtOpenEvent;
dtOpenEvent = Generix.getOpenEvents(ref Connection);
DataTable dtOutput;
dtOutput = Generix.getFeedData(ref Connection);
var matched = from table1 in dtOpenEvent.AsEnumerable()
              join table2 in dtOutput.AsEnumerable() on table1.Field<string>("ATM") equals table2.Field<string>("termid")
              where table1.Field<int>("Event") == table2.Field<int>("faultid") 
              select table1;
var missing = from table1 in dtOpenEvent.AsEnumerable()
              where !matched.Contains(table1)
              select table1;
DataTableDTOpenEvent;
dtOpenEvent=Generix.getOpenEvents(参考连接);
数据表输出;
dtOutput=Generix.getFeedData(参考连接);
var matched=来自dtOpenEvent.AsEnumerable()中的表1
将table2连接到table1.Field(“ATM”)上的dtOutput.AsEnumerable()中等于table2.Field(“termid”)
其中table1.字段(“事件”)==table2.字段(“faultid”)
选择表1;
var missing=来自dtOpenEvent.AsEnumerable()中的表1
哪里匹配。包含(表1)
选择表1;

您可以删除dt1中的所有列,然后执行“除外”

像这样:
var diff=dt2.aseneumerable().Except(dt1.aseneumerable(),DataRowComparer.Default)

完整示例:

            DataTable dt1 = new DataTable();
            DataTable dt2 = new DataTable();

            dt1.Columns.Add("termid", typeof(Int32));
            dt1.Columns.Add("faultid", typeof(Int32));
            dt1.Columns.Add("faultdesc");
            dt2.Columns.Add("termid", typeof(Int32));
            dt2.Columns.Add("faultid", typeof(Int32));

            dt1.Rows.Add(1,2,"desc");
            dt1.Rows.Add(3, 4, "desc");
            dt1.Rows.Add(5, 6, "desc");
            dt2.Rows.Add(1, 2);
            dt2.Rows.Add(3, 4);
            dt2.Rows.Add(7, 8);

            dt1.Columns.Remove("faultdesc");
            var diff =dt2.AsEnumerable().Except(dt1.AsEnumerable(), DataRowComparer.Default);

            foreach (var row in diff)
            {
                Console.WriteLine(row["termid"] + " " + row["faultid"]); //prints 7 8
            }  
            DataTable dt1 = new DataTable();
            DataTable dt2 = new DataTable();

            dt1.Columns.Add("termid", typeof(Int32));
            dt1.Columns.Add("faultid", typeof(Int32));
            dt1.Columns.Add("faultdesc");
            dt2.Columns.Add("termid", typeof(Int32));
            dt2.Columns.Add("faultid", typeof(Int32));

            dt1.Rows.Add(1,2,"desc");
            dt1.Rows.Add(3, 4, "desc");
            dt1.Rows.Add(5, 6, "desc");
            dt2.Rows.Add(1, 2);
            dt2.Rows.Add(3, 4);
            dt2.Rows.Add(7, 8);

            var view = new DataView(dt1);
            DataTable dt3 = view.ToTable(true, "termid", "faultid");
            var diff =dt2.AsEnumerable().Except(dt3.AsEnumerable(), DataRowComparer.Default);

            foreach (var row in diff)
            {
                Console.WriteLine(row["termid"] + " " + row["faultid"]);
            }
或者,您可以通过linq或dataview选择列,而不是删除列,如下所示:

        var view = new DataView(dt1);
        DataTable dt3 = view.ToTable(true, "termid", "faultid");    
修改示例:

            DataTable dt1 = new DataTable();
            DataTable dt2 = new DataTable();

            dt1.Columns.Add("termid", typeof(Int32));
            dt1.Columns.Add("faultid", typeof(Int32));
            dt1.Columns.Add("faultdesc");
            dt2.Columns.Add("termid", typeof(Int32));
            dt2.Columns.Add("faultid", typeof(Int32));

            dt1.Rows.Add(1,2,"desc");
            dt1.Rows.Add(3, 4, "desc");
            dt1.Rows.Add(5, 6, "desc");
            dt2.Rows.Add(1, 2);
            dt2.Rows.Add(3, 4);
            dt2.Rows.Add(7, 8);

            dt1.Columns.Remove("faultdesc");
            var diff =dt2.AsEnumerable().Except(dt1.AsEnumerable(), DataRowComparer.Default);

            foreach (var row in diff)
            {
                Console.WriteLine(row["termid"] + " " + row["faultid"]); //prints 7 8
            }  
            DataTable dt1 = new DataTable();
            DataTable dt2 = new DataTable();

            dt1.Columns.Add("termid", typeof(Int32));
            dt1.Columns.Add("faultid", typeof(Int32));
            dt1.Columns.Add("faultdesc");
            dt2.Columns.Add("termid", typeof(Int32));
            dt2.Columns.Add("faultid", typeof(Int32));

            dt1.Rows.Add(1,2,"desc");
            dt1.Rows.Add(3, 4, "desc");
            dt1.Rows.Add(5, 6, "desc");
            dt2.Rows.Add(1, 2);
            dt2.Rows.Add(3, 4);
            dt2.Rows.Add(7, 8);

            var view = new DataView(dt1);
            DataTable dt3 = view.ToTable(true, "termid", "faultid");
            var diff =dt2.AsEnumerable().Except(dt3.AsEnumerable(), DataRowComparer.Default);

            foreach (var row in diff)
            {
                Console.WriteLine(row["termid"] + " " + row["faultid"]);
            }

您可以删除dt1中的所有列,然后执行“除外”

像这样:
var diff=dt2.aseneumerable().Except(dt1.aseneumerable(),DataRowComparer.Default)

完整示例:

            DataTable dt1 = new DataTable();
            DataTable dt2 = new DataTable();

            dt1.Columns.Add("termid", typeof(Int32));
            dt1.Columns.Add("faultid", typeof(Int32));
            dt1.Columns.Add("faultdesc");
            dt2.Columns.Add("termid", typeof(Int32));
            dt2.Columns.Add("faultid", typeof(Int32));

            dt1.Rows.Add(1,2,"desc");
            dt1.Rows.Add(3, 4, "desc");
            dt1.Rows.Add(5, 6, "desc");
            dt2.Rows.Add(1, 2);
            dt2.Rows.Add(3, 4);
            dt2.Rows.Add(7, 8);

            dt1.Columns.Remove("faultdesc");
            var diff =dt2.AsEnumerable().Except(dt1.AsEnumerable(), DataRowComparer.Default);

            foreach (var row in diff)
            {
                Console.WriteLine(row["termid"] + " " + row["faultid"]); //prints 7 8
            }  
            DataTable dt1 = new DataTable();
            DataTable dt2 = new DataTable();

            dt1.Columns.Add("termid", typeof(Int32));
            dt1.Columns.Add("faultid", typeof(Int32));
            dt1.Columns.Add("faultdesc");
            dt2.Columns.Add("termid", typeof(Int32));
            dt2.Columns.Add("faultid", typeof(Int32));

            dt1.Rows.Add(1,2,"desc");
            dt1.Rows.Add(3, 4, "desc");
            dt1.Rows.Add(5, 6, "desc");
            dt2.Rows.Add(1, 2);
            dt2.Rows.Add(3, 4);
            dt2.Rows.Add(7, 8);

            var view = new DataView(dt1);
            DataTable dt3 = view.ToTable(true, "termid", "faultid");
            var diff =dt2.AsEnumerable().Except(dt3.AsEnumerable(), DataRowComparer.Default);

            foreach (var row in diff)
            {
                Console.WriteLine(row["termid"] + " " + row["faultid"]);
            }
或者,您可以通过linq或dataview选择列,而不是删除列,如下所示:

        var view = new DataView(dt1);
        DataTable dt3 = view.ToTable(true, "termid", "faultid");    
修改示例:

            DataTable dt1 = new DataTable();
            DataTable dt2 = new DataTable();

            dt1.Columns.Add("termid", typeof(Int32));
            dt1.Columns.Add("faultid", typeof(Int32));
            dt1.Columns.Add("faultdesc");
            dt2.Columns.Add("termid", typeof(Int32));
            dt2.Columns.Add("faultid", typeof(Int32));

            dt1.Rows.Add(1,2,"desc");
            dt1.Rows.Add(3, 4, "desc");
            dt1.Rows.Add(5, 6, "desc");
            dt2.Rows.Add(1, 2);
            dt2.Rows.Add(3, 4);
            dt2.Rows.Add(7, 8);

            dt1.Columns.Remove("faultdesc");
            var diff =dt2.AsEnumerable().Except(dt1.AsEnumerable(), DataRowComparer.Default);

            foreach (var row in diff)
            {
                Console.WriteLine(row["termid"] + " " + row["faultid"]); //prints 7 8
            }  
            DataTable dt1 = new DataTable();
            DataTable dt2 = new DataTable();

            dt1.Columns.Add("termid", typeof(Int32));
            dt1.Columns.Add("faultid", typeof(Int32));
            dt1.Columns.Add("faultdesc");
            dt2.Columns.Add("termid", typeof(Int32));
            dt2.Columns.Add("faultid", typeof(Int32));

            dt1.Rows.Add(1,2,"desc");
            dt1.Rows.Add(3, 4, "desc");
            dt1.Rows.Add(5, 6, "desc");
            dt2.Rows.Add(1, 2);
            dt2.Rows.Add(3, 4);
            dt2.Rows.Add(7, 8);

            var view = new DataView(dt1);
            DataTable dt3 = view.ToTable(true, "termid", "faultid");
            var diff =dt2.AsEnumerable().Except(dt3.AsEnumerable(), DataRowComparer.Default);

            foreach (var row in diff)
            {
                Console.WriteLine(row["termid"] + " " + row["faultid"]);
            }
根据问题的上下文翻译:您有两个表
dtOutput
dtOpenEvent
。您希望在第三个表中获取
dtOutput
的值,这样第三个表中的任何行都不会与
dtOpenEvent
的任何行的前两个单元格具有相同的值。那就在这里

DataTable dt3 = new DataTable();
dt3.Columns.Add("termid");
dt3.Columns.Add("faultid");
int nr = 0;
for (int i = 0; i < dtOutput.Rows.Count; i++)
{
    bool found = false;
    for (int j = 0; j < dtOpenEvent.Rows.Count; j++)
    {
        if (dtOutput.Rows[i][0] == dtOpenEvent.Rows[j][0] 
            && dtOutput.Rows[i][1] == dtOpenEvent.Rows[j][1])
        {
            found = true;
            break;
        }
    }
    if (!found)
    {
        dt3.Rows.Add(dt3.NewRow());
        dt3.Rows[nr][0] = dtOutput.Rows[i][0];
        dt3.Rows[nr][1] = dtOutput.Rows[i][1];
        nr++;
    }
}
DataTable dt3=newdatatable();
dt3.列。添加(“termid”);
dt3.Columns.Add(“faultid”);
int nr=0;
对于(int i=0;i
根据问题的上下文翻译:您有两个表
dtOutput
dtOpenEvent
。您希望在第三个表中获取
dtOutput
的值,这样第三个表中的任何行都不会与
dtOpenEvent
的任何行的前两个单元格具有相同的值。那就在这里

DataTable dt3 = new DataTable();
dt3.Columns.Add("termid");
dt3.Columns.Add("faultid");
int nr = 0;
for (int i = 0; i < dtOutput.Rows.Count; i++)
{
    bool found = false;
    for (int j = 0; j < dtOpenEvent.Rows.Count; j++)
    {
        if (dtOutput.Rows[i][0] == dtOpenEvent.Rows[j][0] 
            && dtOutput.Rows[i][1] == dtOpenEvent.Rows[j][1])
        {
            found = true;
            break;
        }
    }
    if (!found)
    {
        dt3.Rows.Add(dt3.NewRow());
        dt3.Rows[nr][0] = dtOutput.Rows[i][0];
        dt3.Rows[nr][1] = dtOutput.Rows[i][1];
        nr++;
    }
}
DataTable dt3=newdatatable();
dt3.列。添加(“termid”);
dt3.Columns.Add(“faultid”);
int nr=0;
对于(int i=0;i
如果您被卡住了,为什么不试试最简单的方法呢。最简单的方法是表2中的两个循环。。要将其两个字段与表1的每一行进行比较(如果发现任何行相似),请继续使用表2的下一个值。如果在最后一行之前未与表1的任何一行匹配。。然后将表1的这一行添加到第三个表:)是的,偏离了路线。如果你得到帮助,我会很高兴的。我已经做到了。你可以查一下。希望它能满足你的需要如果你被卡住了,为什么不试试最简单的方法呢。最简单的方法是表2中的两个循环。。要将其两个字段与表1的每一行进行比较(如果发现任何行相似),请继续使用表2的下一个值。如果在最后一行之前未与表1的任何一行匹配。。然后将表1的这一行添加到第三个表:)是的,偏离了路线。如果你得到帮助,我会很高兴的。我已经做到了。你可以查一下。希望它能满足你的需要。。