Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/266.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#_Asp.net_Linq_Datatable_Compare - Fatal编程技术网

C# 如何比较两个数据表的单元格值

C# 如何比较两个数据表的单元格值,c#,asp.net,linq,datatable,compare,C#,Asp.net,Linq,Datatable,Compare,如果我有两个具有相同结构、相同主键和相同列数的数据表 如何比较它们的内容,并检测两个数据表中不相同的单元格 例: TB\U离线 emp_num(key) salary ov 455 3000 67.891 677 5000 89.112 778 6000 12.672 emp_num(key) salary ov 455

如果我有两个具有相同结构、相同主键和相同列数的数据表

如何比较它们的
内容
,并检测两个数据表中不相同的单元格

例:

TB\U离线

emp_num(key)  salary      ov    

 455           3000      67.891   
 677           5000      89.112    
 778           6000      12.672   
emp_num(key)  salary      ov  

 455           3000      67.891 
 677           5000      50.113 
 778           5500      12.672   
/// Compares the values of each row in the provided DataTables and returns any rows that have a difference based on a provided 'key' column. /// the 'pre' data. /// the 'post' data. /// Name of the column to use for matching rows. /// New DataTable populated with difference rows only. public DataTable Compare(DataTable left, DataTable right, string keyColumn) { const string Pre = "_Pre"; const string Post = "_Post"; DataColumn leftKey = left.Columns.Contains(keyColumn) ? left.Columns[keyColumn] : null; DataColumn rightKey = right.Columns.Contains(keyColumn) ? right.Columns[keyColumn] : null; if (leftKey == null || rightKey == null) { return null; } // Get the matching columns between the two tables for doing comparisons. List comparisonColumns = new List(); DataTable results = new DataTable(); // Adding the key column to the front for sake of ease of viewing. results.Columns.Add(new DataColumn(leftKey.ColumnName, leftKey.DataType)); foreach (DataColumn column in left.Columns) { if(column == leftKey) { continue; } // Remove any columns that are not present in the compare table. foreach (DataColumn compareColumn in right.Columns) { if (column.ColumnName == compareColumn.ColumnName && column.DataType == compareColumn.DataType) { comparisonColumns.Add(column.ColumnName); results.Columns.Add(new DataColumn(column.ColumnName + Pre, column.DataType)); results.Columns.Add(new DataColumn(column.ColumnName + Post, column.DataType)); break; } } } foreach (DataRow leftRow in left.Rows) { object key = leftRow.Field(leftKey); string filterExpression = string.Format("{0} = {1}", keyColumn, key); DataRow rightRow = right.Select(filterExpression).SingleOrDefault(); // Need a row for a comparison to be valid. if (rightRow == null) { continue; } List comparison = new List(); comparison.Add(key); bool isDiff = false; foreach (string comparisonColumn in comparisonColumns) { object pre = leftRow.ItemArray[left.Columns.IndexOf(comparisonColumn)]; comparison.Add(pre); object post = rightRow.ItemArray[right.Columns.IndexOf(comparisonColumn)]; comparison.Add(post); // Only need the row if the values differ in at least one column. isDiff |= (pre == null && post != null) || (pre != null && post == null) || (!pre.Equals(post)); } if (isDiff) { results.Rows.Add(comparison.ToArray()); } } return results; } TB\U在线

emp_num(key)  salary      ov    

 455           3000      67.891   
 677           5000      89.112    
 778           6000      12.672   
emp_num(key)  salary      ov  

 455           3000      67.891 
 677           5000      50.113 
 778           5500      12.672   
/// Compares the values of each row in the provided DataTables and returns any rows that have a difference based on a provided 'key' column. /// the 'pre' data. /// the 'post' data. /// Name of the column to use for matching rows. /// New DataTable populated with difference rows only. public DataTable Compare(DataTable left, DataTable right, string keyColumn) { const string Pre = "_Pre"; const string Post = "_Post"; DataColumn leftKey = left.Columns.Contains(keyColumn) ? left.Columns[keyColumn] : null; DataColumn rightKey = right.Columns.Contains(keyColumn) ? right.Columns[keyColumn] : null; if (leftKey == null || rightKey == null) { return null; } // Get the matching columns between the two tables for doing comparisons. List comparisonColumns = new List(); DataTable results = new DataTable(); // Adding the key column to the front for sake of ease of viewing. results.Columns.Add(new DataColumn(leftKey.ColumnName, leftKey.DataType)); foreach (DataColumn column in left.Columns) { if(column == leftKey) { continue; } // Remove any columns that are not present in the compare table. foreach (DataColumn compareColumn in right.Columns) { if (column.ColumnName == compareColumn.ColumnName && column.DataType == compareColumn.DataType) { comparisonColumns.Add(column.ColumnName); results.Columns.Add(new DataColumn(column.ColumnName + Pre, column.DataType)); results.Columns.Add(new DataColumn(column.ColumnName + Post, column.DataType)); break; } } } foreach (DataRow leftRow in left.Rows) { object key = leftRow.Field(leftKey); string filterExpression = string.Format("{0} = {1}", keyColumn, key); DataRow rightRow = right.Select(filterExpression).SingleOrDefault(); // Need a row for a comparison to be valid. if (rightRow == null) { continue; } List comparison = new List(); comparison.Add(key); bool isDiff = false; foreach (string comparisonColumn in comparisonColumns) { object pre = leftRow.ItemArray[left.Columns.IndexOf(comparisonColumn)]; comparison.Add(pre); object post = rightRow.ItemArray[right.Columns.IndexOf(comparisonColumn)]; comparison.Add(post); // Only need the row if the values differ in at least one column. isDiff |= (pre == null && post != null) || (pre != null && post == null) || (!pre.Equals(post)); } if (isDiff) { results.Rows.Add(comparison.ToArray()); } } return results; }
我希望得到这样的结果(或一些结构来显示差异):


注意:

emp_num, salary_Pre, salary_Post, ov_Pre, ov_Post 677, 5000, 5000, 89.112, 50.113 778, 6000, 5500, 12.672, 12.672 4, , 10, 9.2, 9.2
如果这与SQL相关,则可以使用except SQL命令:

从TB_Online中选择* 除了 选择*从TB_脱机


您可以查看一下,在SQL查询中的“使用EXCEPT子句比较表”下,您可以连接两个表,并使用SELECT-CASE语句确定每列的差值: e、 g


要删除所有具有精确值的行,您可以根据上面的结果表再次选择

您可以先获取所有键,然后创建一个新的
摘要
对象,将数据放在那里并让它进行比较工作。最后,你可以用它做任何你想做的事情:

void Main()
{
    var dt1 = new DataTable();
    dt1.Columns.Add("emp_num", typeof(int));
    dt1.Columns.Add("salary", typeof(int));
    dt1.Columns.Add("ov", typeof(double));
    dt1.Rows.Add(455, 3000, 67.891);
    dt1.Rows.Add(677, 5000, 89.112);
    dt1.Rows.Add(778, 6000, 12.672);

    var dt2 = new DataTable();
    dt2.Columns.Add("emp_num", typeof(int));
    dt2.Columns.Add("salary", typeof(int));
    dt2.Columns.Add("ov", typeof(double));
    dt2.Rows.Add(455, 3000, 67.891);
    dt2.Rows.Add(677, 5000, 50.113);
    dt2.Rows.Add(778, 5500, 12.672);
    dt2.Rows.Add(779, 5500, 12.672);

    var keys = new HashSet<int>(dt1.AsEnumerable().Select (x => (int)x["emp_num"]));
    keys.UnionWith(dt2.AsEnumerable().Select (x => (int)x["emp_num"]));

    keys.Dump("emp_num (keys)");

    var results = keys.Select (emp_num => 
    {
        var rowOff = dt1.Select("emp_num = " + emp_num).FirstOrDefault();
        var rowOn = dt2.Select("emp_num = " + emp_num).FirstOrDefault();
        return new Summary(emp_num, rowOff, rowOn);
    });

    results.Dump("Summary");
}

根据您的新要求,您可以尝试此功能

它首先获取主键名称—
Unique
列,然后获取其他列名称,用新列名创建一个新的
DataTable
,填充值并创建一个表达式来比较它们:

void Main()
{
    // create some test data

    var dt1 = new DataTable();
    dt1.Columns.Add("emp_num", typeof(int));
    dt1.Columns.Add("salary", typeof(int));
    dt1.Columns.Add("ov", typeof(double));
    dt1.Columns[0].Unique = true;

    dt1.Rows.Add(455, 3000, 67.891);
    dt1.Rows.Add(677, 5000, 89.112);
    dt1.Rows.Add(778, 6000, 12.672);

    var dt2 = new DataTable();
    dt2.Columns.Add("emp_num", typeof(int));
    dt2.Columns.Add("salary", typeof(int));
    dt2.Columns.Add("ov", typeof(double));
    dt2.Columns[0].Unique = true;

    dt2.Rows.Add(455, 3000, 67.891);
    dt2.Rows.Add(677, 5000, 50.113);
    dt2.Rows.Add(778, 5500, 12.672);
    dt2.Rows.Add(779, 5500, 12.672);

    var result = CompareDataTables(dt1, dt2);
    result.Dump("Result");

}
CompareDataTables
方法:

static DataTable CompareDataTables(DataTable dt1, DataTable dt2)
{
    var keyName = dt1.Columns.Cast<DataColumn>().Single (x => x.Unique).ColumnName;
    var dt1Cols = dt1.Columns.Cast<DataColumn>().Where (x => !x.Unique).Select (x =>x.ColumnName );
    var dt2Cols = dt1.Columns.Cast<DataColumn>().Where (x => !x.Unique).Select (x =>x.ColumnName );

    // get keys from both data tables
    var keys = new HashSet<int>(dt1.AsEnumerable().Select (x => (int)x[keyName]));
    keys.UnionWith(dt2.AsEnumerable().Select (x => (int)x[keyName]));

    keys.Dump("keys");

    // create a new data table that will hold the results
    var result = new DataTable();
    result.Columns.Add(keyName, typeof(int));
    result.Columns[0].Unique = true;

    // initialize data and comparison columns
    foreach (var name in dt1Cols)
    {
        result.Columns.Add(name + "_off", dt1.Columns[name].DataType);
        result.Columns.Add(name + "_on", dt1.Columns[name].DataType);
        result.Columns.Add(name + "_same", typeof(bool), name + "_off = " + name + "_on");
    } 


    foreach (var key in keys)
    {
        // get a row from each data table with the current key
        var rowOff = dt1.Select(keyName + " = " + key).FirstOrDefault();
        var rowOn = dt2.Select(keyName + " = " + key).FirstOrDefault();

        // create a new row            
        var newRow = result.NewRow();

        // fill the new row with off data
        if (rowOff != null)
        {
            newRow[keyName] = rowOff[keyName];
            foreach (var name in dt1Cols)
            {
                newRow[name + "_off"] = rowOff[name];
            }
        }

        // fill the new row with on data
        if (rowOn != null)
        {
            foreach (var name in dt1Cols)
            {
                newRow[name + "_on"] = rowOn[name];
            }
            newRow[keyName] = rowOn[keyName];
        }

        // add the row to the result data table
        result.Rows.Add(newRow);        
    }

    return result;
}
静态数据表比较数据表(数据表dt1、数据表dt2)
{
var keyName=dt1.Columns.Cast().Single(x=>x.Unique).ColumnName;
var dt1Cols=dt1.Columns.Cast()。其中(x=>!x.Unique)。选择(x=>x.ColumnName);
var dt2Cols=dt1.Columns.Cast()。其中(x=>!x.Unique)。选择(x=>x.ColumnName);
//从两个数据表中获取键
var keys=newhashset(dt1.AsEnumerable().Select(x=>(int)x[keyName]);
UnionWith(dt2.AsEnumerable().Select(x=>(int)x[keyName]);
密钥。转储(“密钥”);
//创建将保存结果的新数据表
var result=新数据表();
Add(keyName,typeof(int));
result.Columns[0]。Unique=true;
//初始化数据和比较列
foreach(dt1Cols中的变量名称)
{
result.Columns.Add(name+“_off”,dt1.Columns[name].DataType);
result.Columns.Add(name+“_on”,dt1.Columns[name].DataType);
添加(name+“_-same”、typeof(bool)、name+“_-off=“+name+”_-on”);
} 
foreach(var键入键)
{
//使用当前键从每个数据表中获取一行
var rowOff=dt1.Select(keyName+“=”+key.FirstOrDefault();
var rowOn=dt2.Select(keyName+“=”+key.FirstOrDefault();
//创建新行
var newRow=result.newRow();
//用关闭数据填充新行
if(rowOff!=null)
{
newRow[keyName]=rowOff[keyName];
foreach(dt1Cols中的变量名称)
{
newRow[name+“_off”]=罗夫[name];
}
}
//用on数据填充新行
if(rown!=null)
{
foreach(dt1Cols中的变量名称)
{
newRow[name+“_on”]=rown[name];
}
newRow[keyName]=rown[keyName];
}
//将该行添加到结果数据表中
result.Rows.Add(newRow);
}
返回结果;
}


它不是防弹的。最好检查数据表是否具有相同的结构。

以下是完成任务的一种方法:

 var dt1 = new DataTable();
        dt1.Columns.Add("emp_num", typeof(int));
        dt1.Columns.Add("salary", typeof(int));
        dt1.Columns.Add("ov", typeof(double));
        dt1.Columns[0].Unique = true;

        dt1.Rows.Add(455, 3000, 67.891);
        dt1.Rows.Add(677, 6000, 50.113);
        dt1.Rows.Add(778, 5500, 12.650);
        dt1.Rows.Add(779, 5500, 12.672);

        var dt2 = new DataTable();
        dt2.Columns.Add("emp_num", typeof(int));
        dt2.Columns.Add("salary", typeof(int));
        dt2.Columns.Add("ov", typeof(double));
        dt2.Columns[0].Unique = true;

        dt2.Rows.Add(455, 3000, 67.891);
        dt2.Rows.Add(677, 5000, 50.113);
        dt2.Rows.Add(778, 5500, 12.672);
        dt2.Rows.Add(779, 5500, 12.672);

        var dtListValues1 = new List<List<string>>();



        for (int j = 0; j < dt2.Rows.Count; j++)
        {
            var list = new List<string>();
            for (var i = 0; i < dt2.Columns.Count; i++)
            {                

                    list.Add(dt2.Rows[j][i].ToString());
                list.Add("===");

                    list.Add(dt1.Rows[j][i].ToString());
                list.Add("||");
                if(dt2.Rows[j][i].ToString() == dt1.Rows[j][i].ToString())
                {
                    list.Add("true");
                }
                else
                {
                    list.Add("false");
                }

            }
            dtListValues1.Add(list);
        }

        var rowsWithDifferentCells = dtListValues1.Where(x => x.Contains("false"));


        foreach (var item in dtListValues1)
        {
            Console.WriteLine("Row-->> "+ string.Join(",",item));
        }
        Console.WriteLine("----------------------------------------");
        foreach (var item in rowsWithDifferentCells)
        {
            Console.WriteLine("Row with different cell-->> "+string.Join(",", item));
        }
var dt1=新数据表();
dt1.Columns.Add(“emp_num”,typeof(int));
dt1.列。添加(“工资”,类型(int));
dt1.列。添加(“ov”,类型(双));
dt1.Columns[0]。Unique=true;
dt1.Rows.Add(455300067.891);
dt1.行。添加(677、6000、50.113);
dt1.行。添加(7785500,12.650);
dt1.Rows.Add(7795500,12.672);
var dt2=新数据表();
dt2.Columns.Add(“emp_num”,typeof(int));
dt2.列。添加(“工资”,类型(int));
dt2.列。添加(“ov”,类型(双));
dt2.Columns[0]。Unique=true;
dt2.Rows.Add(455300067.891);
dt2.行。添加(677、5000、50.113);
dt2.Rows.Add(7785500,12.672);
dt2.Rows.Add(7795500,12.672);
var dtListValues1=新列表();
对于(int j=0;jx.Contains(“false”);
foreach(dtListValues1中的var项)
{
Console.WriteLine(“行-->>”+string.Join(“,”,item));
}
Console.WriteLine(“---------------------------------------------------”;
foreach(行中的var项与不同的单元格)
{
WriteLine(“具有不同单元格的行-->>”+string.Join(“,”,item));
}
我将所有测试数据放入
列表()
,在此过程中,我还检查了值是否相同。然后我将一个过滤器设置为false,只显示包含不同值单元格的行

你只需要把这段代码放在控制台里。并测试它


当然,这不是最好的方法,但却是检查数据的快速方法

这是一个相当通用的方法的实现,它比较两个数据表并返回另一个具有不同属性的数据表 /// Compares the values of each row in the provided DataTables and returns any rows that have a difference based on a provided 'key' column. /// the 'pre' data. /// the 'post' data. /// Name of the column to use for matching rows. /// New DataTable populated with difference rows only. public DataTable Compare(DataTable left, DataTable right, string keyColumn) { const string Pre = "_Pre"; const string Post = "_Post"; DataColumn leftKey = left.Columns.Contains(keyColumn) ? left.Columns[keyColumn] : null; DataColumn rightKey = right.Columns.Contains(keyColumn) ? right.Columns[keyColumn] : null; if (leftKey == null || rightKey == null) { return null; } // Get the matching columns between the two tables for doing comparisons. List comparisonColumns = new List(); DataTable results = new DataTable(); // Adding the key column to the front for sake of ease of viewing. results.Columns.Add(new DataColumn(leftKey.ColumnName, leftKey.DataType)); foreach (DataColumn column in left.Columns) { if(column == leftKey) { continue; } // Remove any columns that are not present in the compare table. foreach (DataColumn compareColumn in right.Columns) { if (column.ColumnName == compareColumn.ColumnName && column.DataType == compareColumn.DataType) { comparisonColumns.Add(column.ColumnName); results.Columns.Add(new DataColumn(column.ColumnName + Pre, column.DataType)); results.Columns.Add(new DataColumn(column.ColumnName + Post, column.DataType)); break; } } } foreach (DataRow leftRow in left.Rows) { object key = leftRow.Field(leftKey); string filterExpression = string.Format("{0} = {1}", keyColumn, key); DataRow rightRow = right.Select(filterExpression).SingleOrDefault(); // Need a row for a comparison to be valid. if (rightRow == null) { continue; } List comparison = new List(); comparison.Add(key); bool isDiff = false; foreach (string comparisonColumn in comparisonColumns) { object pre = leftRow.ItemArray[left.Columns.IndexOf(comparisonColumn)]; comparison.Add(pre); object post = rightRow.ItemArray[right.Columns.IndexOf(comparisonColumn)]; comparison.Add(post); // Only need the row if the values differ in at least one column. isDiff |= (pre == null && post != null) || (pre != null && post == null) || (!pre.Equals(post)); } if (isDiff) { results.Rows.Add(comparison.ToArray()); } } return results; } emp_num, salary_Pre, salary_Post, ov_Pre, ov_Post 677, 5000, 5000, 89.112, 50.113 778, 6000, 5500, 12.672, 12.672 4, , 10, 9.2, 9.2
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;

namespace SO_DataTableCompare
{
    class Program
    {
        static void Main(string[] args)
        {
            /// Build data and test the underlying method.
            Dictionary<string,Type> columns = new Dictionary<string, Type>();
            columns.Add("emp_num", typeof(int));
            columns.Add("salary", typeof(int));
            columns.Add("ov", typeof(double));

            DataTable left = new DataTable();
            foreach (KeyValuePair<string,Type> column in columns)
            {
                left.Columns.Add(column.Key, column.Value);
            }
            left.Rows.Add(455, 3000, 67.891);
            left.Rows.Add(677, 5000, 89.112);
            left.Rows.Add(778, 6000, 12.672);
            left.Rows.Add(9001, 5500, 12.672);
            left.Rows.Add(4, null, 9.2);
            //left.Dump("Left");

            DataTable right = new DataTable();
            right.Columns.Add("outlier", typeof(string));
            foreach (KeyValuePair<string, Type> column in columns)
            {
                right.Columns.Add(column.Key, column.Value);
            }
            right.Columns.Add("float", typeof(float));
            right.Rows.Add(0, 455, 3000, 67.891, 5);
            right.Rows.Add(1, 677, 5000, 50.113, 5);
            right.Rows.Add(2, 778, 5500, 12.672, 6);
            right.Rows.Add(2, 9000, 5500, 12.672, 6);
            right.Rows.Add(3, 4, 10, 9.2, 7);
            //right.Dump("Right");


            // Compare.
            DataTable results = Compare(left, right, "emp_num");
            //results.Dump("Results"); // Fancy table output via LINQPad.

            // Get the comparison columns for display.
            List<string> comparedColumns = new List<string>();
            foreach (DataColumn column in results.Columns)
            {
                comparedColumns.Add(column.ColumnName);
            }

            // Display the comparison rows.
            Console.WriteLine(string.Join(", ", comparedColumns));
            foreach (DataRow row in results.Rows)
            {
                Console.WriteLine(string.Join(", ", row.ItemArray));
            }
            Console.ReadKey();
        }

        private static DataTable Compare(DataTable left, DataTable right, string keyColumn, string suffix1="_off",string suffix2="_on")
        {
            var columns = left.Columns.OfType<DataColumn>().Select(c => c.ColumnName).ToList();
            var updated = left.Rows.OfType<DataRow>()
                .Join(right.Rows.OfType<DataRow>(), row => row[keyColumn], row => row[keyColumn], (row1, row2) => new { key = row1[keyColumn], row1, row2 })
                .Where(o => o.row2!=null && !DataRowSame(o.row1, o.row2, columns));
            //var deleted = left.Rows.OfType<DataRow>().Except(right.Rows.OfType<DataRow>(), new DataRowKeyComparer(keyColumn));
            //var inserted = right.Rows.OfType<DataRow>().Except(left.Rows.OfType<DataRow>(), new DataRowKeyComparer(keyColumn));
            var result = new DataTable();
            result.Columns.Add(keyColumn, left.Columns[keyColumn].DataType);
            int k = 0;
            foreach (var name in columns.Where(c=>c!=keyColumn))
            {
                k++;
                result.Columns.Add(name + suffix1, left.Columns[name].DataType);
                result.Columns.Add(name + suffix2, right.Columns[name].DataType);
                result.Columns.Add("s"+k, typeof(int));
            }
            result.BeginLoadData();
            foreach (var upd in updated)
            {
                var vals = new[] { upd.key }.Concat(
                        columns.Where(c => c != keyColumn)
                            .Select(c => new
                            {
                                l = upd.row1[c],
                                r = upd.row2[c]
                            })
                            .SelectMany(o => new object[] { o.l, o.r, object.Equals(o.l, o.r) ? 1 : 0 })
                    ).ToArray();
                result.LoadDataRow(vals, LoadOption.OverwriteChanges);
            }
            result.EndLoadData();
            return result;
        }

        private static bool DataRowSame(DataRow row1, DataRow row2, List<string> columns)
        {
            foreach (var name in columns)
            {
                if (!object.Equals(row1[name], row2[name])) return false;
            }
            return true;
        }
    }

    internal class DataRowKeyComparer : IEqualityComparer<DataRow>
    {
        private string keyColumn;

        public DataRowKeyComparer(string keyColumn)
        {
            this.keyColumn = keyColumn;
        }

        public bool Equals(DataRow x, DataRow y)
        {
            return object.Equals(x[keyColumn], y[keyColumn]);
        }

        public int GetHashCode(DataRow obj)
        {
            return obj.GetHashCode();
        }
    }
}
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace WebApplication1
{
    public partial class Default : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {

            //Table 1
            DataTable table1 = new DataTable();

            table1.Columns.Add("emp_num(key)", typeof(Int32));
            table1.Columns.Add("salary", typeof(float));
            table1.Columns.Add("ov", typeof(float));

            table1.Rows.Add(455, 3000, 67.56);
            table1.Rows.Add(456, 4000, 77.56);
            table1.Rows.Add(457, 6000, 87.56);

            grdTable1.DataSource = table1;
            grdTable1.DataBind();


            //Table 2
            DataTable table2 = new DataTable();
            table2.Columns.Add("emp_num(key)", typeof(Int32));
            table2.Columns.Add("salary", typeof(float));
            table2.Columns.Add("ov", typeof(float));

            table2.Rows.Add(455, 3000, 67.56);
            table2.Rows.Add(456, 4000, 27.56);
            table2.Rows.Add(457, 5000, 87.56);

            grdTable2.DataSource = table2;
            grdTable2.DataBind();

            //Compare
            DataTable result = new DataTable();
            result.Columns.Add("emp_num(key)", typeof(Int32));
            result.Columns.Add("salary_Table1", typeof(float));
            result.Columns.Add("salary_Table2", typeof(float));
            result.Columns.Add("same_Salary", typeof(string));
            result.Columns.Add("ov_Table1", typeof(float));
            result.Columns.Add("ov_Table2", typeof(float));
            result.Columns.Add("Same_OV", typeof(string));
            foreach (DataRow t1r in table1.Rows)
            {
                foreach (DataRow t2r in table2.Rows)
                {
                    var array1 = t1r.ItemArray;
                    var array2 = t2r.ItemArray;
                    //Check ID Column to decide if compare needs to be done 
                    if (array1[0].ToString() == array2[0].ToString())
                    {
                        if (array1.SequenceEqual(array2))
                        {
                            break;
                        }
                        else
                        {
                            int SalSame = 0;
                            int OvSame = 0;
                            if (array1[1].ToString() == array2[1].ToString())
                            {
                                SalSame = 1;
                            }
                            if (array1[2].ToString() == array2[2].ToString())
                            {
                                OvSame = 1;
                            }

                            result.Rows.Add(array1[0].ToString(), array1[1].ToString(), array2[1].ToString(), SalSame, array1[2].ToString(), array2[2].ToString(), OvSame);

                        }
                    }
                }
            }
            grdresult.DataSource = result;
            grdresult.DataBind();
        }
    }
}



<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="WebApplication1.Default" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
        <div>

            <h3>First Table </h3>
            <asp:GridView runat="server" ID="grdTable1"></asp:GridView>
            <h3>Second Table </h3>
            <asp:GridView runat="server" ID="grdTable2"></asp:GridView>

            <h3>Result Table </h3>
            <asp:GridView runat="server" ID="grdresult"></asp:GridView>
        </div>
    </form>
</body>
</html>