如何在c#

时间:2019-03-19 05:36:26

标签: c#

如何在C#中比较2个dataTable 例如 dataTable1

  • 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

dataTable2

  • 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;
        }
    }
}

3 个答案:

答案 0 :(得分:0)

您可以尝试使用以下循环,请注意那些重要的注释

        // 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
            }
        }

答案 1 :(得分:0)

您可以返回数据表,该数据表将是两个输入数据表的差,然后可以对所得数据表执行操作。

CODE

    /// <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;
    }

答案 2 :(得分:0)

  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.
        }
    }
}