【问题标题】:How to compare 2 dataTable in c#如何在c#中比较2个数据表
【发布时间】:2019-03-19 18:25:01
【问题描述】:

如何比较 C# 中的 2 个数据表 例如 数据表1

  • a,a,a,a,1,a,a,a,a,a
  • a,a,a,a,1,a,a,a,a,a
  • a,a,a,a,2,a,a,a,a,a
  • a,a,a,a,2,a,a,a,a,a
  • a,a,a,a,3,a,a,a,a,a

数据表2

  • b,b,b,b,1,b,b,b,b,b
  • b,b,b,b,1,b,b,b,b,b
  • b,b,b,b,1,b,b,b,b,b
  • b,b,b,b,2,b,b,b,b,b
  • b,b,b,b,2,b,b,b,b,b

如何运行 dataTable1 [5] 中的第一行 = 1,如果 dataTable2 [5] 也包含 1,则打印出该行。继续直到完成。然后继续循环到dataTable1中的第二个检查dataTable2

这是我的代码

using System;
using System.Collections.Generic;
using System.Data;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace CompareLinuxWithWindow
{
    class Program
    {
        static void Main(string[] args)
        {

            DataTable dt1 = ConvertToDataTable(@"C:\Users\manchunl\Desktop\Sample1.txt", 10);
            DataTable dt2 = ConvertToDataTable2(@"C:\Users\manchunl\Desktop\Sample2.txt", 10);

            foreach (DataRow row in dt1.AsEnumerable())
            {
                string temp_dt1 = "";
                string[] words = temp_dt1.Split(',');

                string.Join(",", row.ItemArray.Select(x => x.ToString()));
                temp_Linux = (string.Join(",", row.ItemArray.Select(x => x.ToString())));

            }

            foreach (DataRow row in dt2.AsEnumerable())
            {
                string temp_dt2 = "";

                string.Join(",", row.ItemArray.Select(x => x.ToString()));
                temp_dt2 = (string.Join(",", row.ItemArray.Select(x => x.ToString())));

            }



            Console.WriteLine();
            Console.WriteLine("Press enter to exit.");
            Console.Read();
        }


        public static DataTable ConvertToDataTable(string filePath, int numberOfColumns)
        {


            DataTable tbl = new DataTable();

            for (int col = 0; col < numberOfColumns; col++)
                tbl.Columns.Add(new DataColumn("Column" + (col + 1).ToString()));


            string[] lines = System.IO.File.ReadAllLines(filePath);

            foreach (string line in lines)
            {
                var cols = line.Split(null);

                DataRow dr = tbl.NewRow();
                for (int cIndex = 0; cIndex < numberOfColumns; cIndex++)
                {
                    dr[cIndex] = cols[cIndex];

                }

                tbl.Rows.Add(dr);

            }

            return tbl;
        }

        public static DataTable ConvertToDataTable2(string filePath, int numberOfColumns)
        {


            DataTable tbl = new DataTable();

            for (int col = 0; col < numberOfColumns; col++)
                tbl.Columns.Add(new DataColumn("Column" + (col + 1).ToString()));


            string[] lines = System.IO.File.ReadAllLines(filePath);

            foreach (string line in lines)
            {
                var cols = line.Split(',');

                DataRow dr = tbl.NewRow();
                for (int cIndex = 0; cIndex < numberOfColumns; cIndex++)
                {
                    dr[cIndex] = cols[cIndex];

                }

                tbl.Rows.Add(dr);

            }

            return tbl;
        }
    }
}

【问题讨论】:

  • 您已经在遍历各个表行,您只需放入一个嵌套循环并比较每一行中的列。
  • 是的,但我不确定如何编写嵌套循环,因为 temp_dt1 和 temp_dt2 在每个 foreach 循环中
  • 实际上,因为您想检查相同的行(即两者中的第 1 行),您甚至不需要嵌套。只需使用简单的 for 循环(使用索引)并访问 table.Rows[index] 即可获取两个数据表(dt1、dt2)的行对象。然后你就可以比较了。
  • 仍然不知道在哪里写:(你能帮我吗?提前谢谢
  • @appleorange,表示你想要 dataTable1 [5] 即 = 1,如果 dataTable2 [5] 也包含 1 => equals 然后打印?

标签: c#


【解决方案1】:

您可以尝试使用如下循环,请注意cmets,因为它们很重要

        // assumption is that both dt1 and dt2 has same number of rows
        // otherise while accessing dt2 we can get index out of range exception
        for (int i = 0; i < dt1.Rows.Count; i++)
        {
            DataRow dr1 = dt1.Rows[i];
            DataRow dr2 = dt2.Rows[i];

            // accessing the column below would return a system.object variable,
            // need to convert it to the right type using one of the convert calls, e.g. Convert.ToInt16(dr1["ColumnName"])
            if (dr1["ColumnName"] == dr2["ColumnName"])
            {
                // do whatever you want to do here
            }
        }

【讨论】:

  • 实际上两个txt文件都没有固定的行。 dt2 大于 dt2。我发现我可以测试在 if 语句之外打印 console.writeline(dt1[4]) 但不能在 if (dr1[4] == dr2[4]) { // 在这里做任何你想做的事情 }
  • 其实没有错误也没有打印任何东西,我把dr1["ColumnName"]改成dr1[4]可以吗,还是不能这样?所以无法打印出来。 if (dr1["ColumnName"] == dr2["ColumnName"]) { // 在这里做任何你想做的事情 }
  • 是的,您可以使用 dr1[4]dr1["Column5"] 之类的方式访问您的专栏
  • 您可以设置断点并进行调试(这允许您在执行期间检查值)。
  • 似乎 iit 无法运行 if else 语句。
【解决方案2】:

您可以返回将是两个输入数据表的差异的数据表,然后您可以对结果数据表进行操作。

代码

    /// <summary>  
    /// Compare two DataTables and return a DataTable with DifferentRecords  
    /// </summary>  
    /// <param name="FirstDataTable">FirstDataTable</param>  
    /// <param name="SecondDataTable">SecondDataTable</param>  
    /// <returns>DifferentRecords</returns>  
    public DataTable getDifferentRecords(DataTable FirstDataTable, DataTable SecondDataTable)
    {
        //Create Empty Table  
        DataTable ResultDataTable = new DataTable("ResultDataTable");
        //use a Dataset to make use of a DataRelation object  
        using (DataSet ds = new DataSet())
        {
            var dataTable = new DataTable[] { FirstDataTable.Copy(), SecondDataTable.Copy() };
            dataTable[0].TableName = "FirstTable";
            dataTable[1].TableName = "SecondTable";
            //Add tables  
            ds.Tables.AddRange(dataTable);
            //Get Columns for DataRelation  
            DataColumn[] firstColumns = new DataColumn[ds.Tables[0].Columns.Count];
            for (int i = 0; i < firstColumns.Length; i++)
            {
                firstColumns[i] = ds.Tables[0].Columns[i];
            }

            DataColumn[] secondColumns = new DataColumn[ds.Tables[1].Columns.Count];
            for (int i = 0; i < secondColumns.Length; i++)
            {
                secondColumns[i] = ds.Tables[1].Columns[i];
            }

            //Create DataRelation  
            DataRelation r1 = new DataRelation(string.Empty, firstColumns, secondColumns, false);
            ds.Relations.Add(r1);
            DataRelation r2 = new DataRelation(string.Empty, secondColumns, firstColumns, false);
            ds.Relations.Add(r2);
            //Create columns for return table  
            for (int i = 0; i < FirstDataTable.Columns.Count; i++)
            {
                ResultDataTable.Columns.Add(FirstDataTable.Columns[i].ColumnName,
                    FirstDataTable.Columns[i].DataType);
            }

            //If FirstDataTable Row not in SecondDataTable, Add to ResultDataTable.  
            ResultDataTable.BeginLoadData();
            foreach (DataRow parentrow in ds.Tables[0].Rows)
            {
                DataRow[] childrows = parentrow.GetChildRows(r1);
                if (childrows == null || childrows.Length == 0)
                {
                    ResultDataTable.LoadDataRow(parentrow.ItemArray, true);
                }
            }

            //If SecondDataTable Row not in FirstDataTable, Add to ResultDataTable.  
            foreach (DataRow parentrow in ds.Tables[1].Rows)
            {
                DataRow[] childrows = parentrow.GetChildRows(r2);
                if (childrows == null || childrows.Length == 0)
                    ResultDataTable.LoadDataRow(parentrow.ItemArray, true);
            }

            ResultDataTable.EndLoadData();
        }

        return ResultDataTable;
    }

【讨论】:

    【解决方案3】:
    1. 您需要先循环第一个数据表
    2. 然后获取特定索引处的行
    3. 检查当前行是否存在于第二个数据表中
    4. 从同一索引的第二个数据表中获取行。
    5. 将列值从行读取到字符串变量。
    6. 检查两行的两个值是否相等。

    DataTable dt1 = ConvertToDataTable(@"C:\Users\manchunl\Desktop\Sample1.txt", 10);
    DataTable dt2 = ConvertToDataTable2(@"C:\Users\manchunl\Desktop\Sample2.txt", 10);
    
    for (int i = 0; i < dt1.Rows.Count; i++)
    {
        DataRow dr1 = dt1.Rows[i];
    
        if (dt2.Rows.Count > i)
        {
            DataRow dr2 = dt2.Rows[i];
    
            string value1 = Convert.ToString(dr1["Column5"]);
            string value2 = Convert.ToString(dr2["Column5"]);
    
            if (!string.IsNullOrEmpty(value1) && !string.IsNullOrEmpty(value2) && value1 == value2)
            {
                Console.WriteLine(value1);
            }
            else
            {
                //Do code when no matched.
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2011-11-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多