【问题标题】:How do you take two datatables and match values, then add something to a column in the matched row values?您如何获取两个数据表并匹配值,然后在匹配的行值中的列中添加一些内容?
【发布时间】:2012-06-25 00:55:40
【问题描述】:

我有两个数据表,我需要匹配每个数据表的邮政编码,每次程序找到匹配项时,我需要将匹配行中的列设置为字符串。 这是我的代码。

我不知道在foreach循环中该做什么,或者如果有更简单的方法可以做到这一点,请说出来。

        //Datatable for entire list of zipcodes
        DataTable datat = new DataTable("DATA");
        DataColumn state = new DataColumn();
        DataColumn county = new DataColumn();
        DataColumn zipcode = new DataColumn();
        DataColumn latitude = new DataColumn();
        DataColumn longitude = new DataColumn();
        DataColumn salesperson = new DataColumn();
        DataColumn originalrec = new DataColumn();

        //Add the columns to the datatable
        datat.Columns.Add(state);
        datat.Columns.Add(county);
        datat.Columns.Add(zipcode);
        datat.Columns.Add(latitude);
        datat.Columns.Add(longitude);
        datat.Columns.Add(salesperson);
        datat.Columns.Add(originalrec);

        return datat;
    }

    private static DataTable InitData2()
    {
        //Datatable for entire list of zipcodes
        DataTable datat2 = new DataTable("DATA");
        DataColumn ctype = new DataColumn();
        DataColumn csalesperson = new DataColumn();
        DataColumn czipcode = new DataColumn();

        //Add the columns to the datatable
        datat2.Columns.Add(ctype);
        datat2.Columns.Add(csalesperson);
        datat2.Columns.Add(czipcode);

        return datat2;
    }       

    private static String InitPath()
    {
        string path = "C:/Documents and Settings/Andre/Desktop/SalesMap/data.csv";
        return path;
    }

    private static String InitPath2()
    {
        string path2 = "C:/Documents and Settings/Andre/Desktop/SalesMap/CUSTOMER_PROSPECT_SALESPERSON.csv";
        return path2;
    }

    public static void Main()
    {
        try
        {
            DataTable dt = InitData1();
            DataTable dt2 = InitData2();
            StreamReader sr = new StreamReader(InitPath());
            StreamReader sr2 = new StreamReader(InitPath2());
            String csvData = string.Empty;
            String csvData2 = string.Empty;

            while ((csvData = sr.ReadLine()) != null)
            {
                String[] data = csvData.Split(',');
                //dt.Rows.Add(data);
                DataRow newRow1 = dt.NewRow();
                newRow1[0] = data[0].ToString();
                newRow1[1] = data[1].ToString();
                newRow1[2] = data[2].ToString();
                newRow1[3] = data[3].ToString();
                newRow1[4] = data[4].ToString();
                newRow1[5] = "";
                newRow1[6] = "";
                dt.Rows.Add(newRow1);

                Console.WriteLine("Row added for: dt");
            }
            dt.WriteXml(@"c:\test\dt1.xml");
            sr.Close();

            while ((csvData2 = sr2.ReadLine()) != null)
            {
                String[] data2 = csvData2.Split(',');
                DataRow newRow2 = dt2.NewRow();
                newRow2[0] = data2[0].ToString();
                newRow2[1] = data2[1].ToString();
                newRow2[2] = data2[2].ToString();
                dt2.Rows.Add(newRow2);

                Console.WriteLine("Row added for: dt2");
            }

            dt2.WriteXml(@"c:\test\dt2.xml");
            sr2.Close();

            foreach (DataRow row1 in dt.Rows)
            {
                //Dont know what to do here
            }
        }

        catch (Exception e)
        {
            //Console.WriteLine("The files could not be read:");
            //Console.WriteLine(e.Message);
            StreamWriter sw = new StreamWriter(@"c:\test\error.txt");
            sw.WriteLine(e.Message);
            sw.Close();


        }
    }
}
}

【问题讨论】:

  • 我尝试过创建一个 foreach 循环,但我不知道该怎么做。我猜我将不得不将一个 foreach 嵌套在另一个 foreach 中,但我不知道该怎么做。另外,这不是针对课程,而是针对我和朋友一起做的项目。
  • @AdamAndre:当你展示你正在使用的代码时,堆栈溢出效果最好。即使它不起作用。

标签: c# datatable datarow datacolumn


【解决方案1】:

不确定我是否完全理解。但正如我可以想象的那样,它应该是这样的:

            DataTable dtSampleOne = new DataTable();
            DataTable dtSampleTwo = new DataTable();

            foreach (DataRow rowSampleOne in dtSampleOne.Rows)
            {
                string zipCodeSampleOne = rowSampleOne["zipCodeToMatchOne"].ToString();

                foreach (DataRow rowSampleTwo in dtSampleTwo.Rows)
                {
                    if (rowSampleTwo["zipCodeToMatchTwo"].ToString().Equals(zipCodeSampleOne))
                    {
                        // Do your stuff here
                    }                            
                }
            }

如果您有任何需要,我会与您保持联系。

【讨论】:

  • 我将尝试一下,如果它有效,请在此处发表评论。谢谢回答!很抱歉,我知道这有点令人困惑,因为我不得不考虑很长时间才能问这个问题:)
  • 我提供的样本应该可以完成这项工作(带有相关的更正)。我还建议使用第三个数据表来管理匹配结果。
  • 您好,我尝试了您的代码,替换了所有变量,但我无法弄清楚“ZipCodeToMatchOne”位置应该包含什么。
  • 这是您的专栏名称。如果您不知道列名是什么,请使用断点或仅使用列索引。
  • 谢谢,成功了!第三个数据库是什么意思,我为什么需要它?
【解决方案2】:

最简单的方法是在存储过程中完成所有操作。所以你的存储过程做一个简单的匹配(可能使用相交)并返回结果。如果您不能使用存储过程,那么我会选择这两个集合并加载到列表中,然后您可以使用 LINQ 命令进行相交。不需要 foreach 循环。

List<string> list1 = // load list from db
List<string> list2 = // load second list from db

var result = list1.Intersect(list2);

就是这样

【讨论】:

    【解决方案3】:

    使用 LINQ,我们可以进一步改进 Luis Hernández 给出的代码,尽管它可以完成这项工作。

    在给定的解决方案 (Luis Hernández) 中,我们有 2 个循环。假设 SampleOne 为 100 行,SampleTwo 为 200 行。我们最终会循环 100 X 200 次!

    相反,我们可以获得匹配的记录,并且我们可以只使用这些记录进行循环。这样可以避免不必要的循环。

            var sampleOne = new DataTable();
            var sampleTwo = new DataTable();
    
            // TODO : I assume these two table have the common column "ZipCode".
            // TODO : Add your sample data here!
    
            var matchingRows = from s1 in sampleOne.AsEnumerable()
                               join s2 in sampleTwo.AsEnumerable() on s1.Field<string>("ZipCode") equals s2.Field<string>("ZipCode")
                               select s1;
    
            foreach (var row in matchingRows)
            {
                // Do your stuff here !
            }
    

    如果我的解决方案不符合要求,请随时通知我!

    【讨论】:

      猜你喜欢
      • 2023-03-26
      • 2021-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-28
      相关资源
      最近更新 更多