0

2 つの表の比較について質問があります。テーブル 1 にテーブル 2 の列の名前が含まれていない場合は、列に値を追加します。だから私は自分のコードでそれをやったが、列がすでにtables1に属しているというエラーが表示される理由がわからない. ここで何が間違っていましたか?それを行うより良い方法はありますか?

例、表 1:

Name   LastName
a       aa
b       bb

表 2:

Name    Product
s       dd
a       ss

結果:

Name   LastName    Product
a       aa         dd
b       bb         ss      

私のコード:

 for (int i = 0; i < excelTb2.Columns.Count; i++)
                {
                    for (int j = 0; j < Temp.Columns.Count; j++ )
                    {
                        if (Temp.Columns[j].ColumnName.ToString() != excelTb2.Columns[i].ColumnName.ToString())
                        {
                            excelTb2.Columns.Add(Temp.Columns[j].ColumnName.ToString());

                            for (int ok = 0; ok < 2; ok++)
                            {
                                excelTb2.Rows[ok][Temp.Columns[j].ColumnName] = Temp.Rows[ok][j];
                            }

                        }
                    }
                }
4

2 に答える 2

0

Merge2 つのスキーマをマージし、 row-index でデータを結合するこのメソッドを使用できますDataTables(両方のテーブルに列が含まれている場合、要求に応じて table1 のデータが取得されます)。

public static DataTable MergeOnRowIndex(DataTable table1, DataTable table2)
{
    var data = table1.AsEnumerable()
        .Select((r, i) => new
        {
            Row1 = r,
            Row2 = i >= table2.Rows.Count ? null : table2.Rows[i]
        });
    DataTable table3 = new DataTable();
    foreach (DataColumn col in table1.Columns)
    {
        table3.Columns.Add(col.ColumnName, col.DataType);
    }
    foreach(DataColumn col in table2.Columns)
        if(!table3.Columns.Contains(col.ColumnName))
            table3.Columns.Add(col.ColumnName, col.DataType);

    if(data.Any())
    {
        foreach(var x in data)
        {
            var newRow = table3.Rows.Add();
            for (int i = 0; i < table1.Columns.Count; i++)
            {
                newRow[i] = x.Row1.ItemArray[i];
            }
            if (x.Row2 != null)
            {
                for (int i = table1.Columns.Count; i < table3.Columns.Count; i++)
                {
                    DataColumn currentColumn = table3.Columns[i];
                    newRow[currentColumn.ColumnName] = x.Row2[currentColumn.ColumnName];
                }
            }
        }
    }
    return table3;
}

ここでは、メソッドを使用して、サンプル データで目的の結果を取得しました。

var table = new DataTable();
table.Columns.Add("Name");
table.Columns.Add("LastName");
var otherTable = new DataTable();
otherTable.Columns.Add("Name");
otherTable.Columns.Add("Product");
table.Rows.Add("a","aa");
table.Rows.Add("b","bb");
otherTable.Rows.Add("s","dd");
otherTable.Rows.Add("a","ss");

DataTable result = MergeOnRowIndex(table, otherTable);
于 2012-11-28T12:15:28.327 に答える
0

列はコレクションです。Contains を使用して、列名が既に存在するかどうかを確認できます

for (int j = 0; j < Temp.Columns.Count; j++ )
{
    if(!excelTb2.Columns.Contains(Temp.Columns[j].ColumnName))
    {
        excelTb2.Columns.Add(Temp.Columns[j].ColumnName.ToString());
        ...
    }
}

これにより、発生するエラーの主な原因であるネストされたループが不要になります

于 2012-11-28T12:37:33.960 に答える