0

2 つのデータ テーブルがあり、各データ テーブルの郵便番号を一致させる必要があります。プログラムが一致を見つけるたびに、一致した行の列を文字列に設定する必要があります。これが私のコードです。

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();


        }
    }
}
}
4

3 に答える 3

3

まったく理解できたかどうかわかりません。しかし、私が想像できるように、それは次のようになるはずです:

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

何か必要な場合は連絡を取ります。

于 2012-06-25T01:17:45.710 に答える
0

最も簡単な方法は、すべてをストアドプロシージャで実行することです。したがって、ストアドプロシージャは単純な一致を実行し(おそらくintersectを使用)、結果を返します。ストアドプロシージャを使用できない場合は、両方のセットを選択してリストにロードし、LINQコマンドを使用してIntersectを実行できます。foreachループは必要ありません。

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

var result = list1.Intersect(list2);

これだよ

于 2012-06-25T01:18:42.250 に答える
0

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

私の解決策が基準に達していない場合は、遠慮なくお知らせください。

于 2013-07-07T16:22:03.047 に答える