将2个datarow行合并为一行C#

将2个datarow行合并为一行C#,c#,join,datatable,datarow,C#,Join,Datatable,Datarow,虽然我知道我可以通过sql连接两行,但我的程序没有使用它 我有两个数据表,每一行与另一个表上的行进行比较,并希望从中进行联接 public DataTable joinTables (DataTable t1, DataTable t2) { DataTable joinTable = new DataTable(); foreach (DataRow r1 in t1.Rows) { foreach (DataR

虽然我知道我可以通过sql连接两行,但我的程序没有使用它 我有两个数据表,每一行与另一个表上的行进行比较,并希望从中进行联接

 public DataTable joinTables (DataTable t1, DataTable t2)
    {
        DataTable joinTable = new DataTable();
        foreach (DataRow r1 in t1.Rows)
        {
            foreach (DataRow r2 in t2.Rows)
            {
                ///if (....)
                    joinTable.ImportRow(joinRows(r1,r2));
            }
        }
        return joinTable;
    }
    public DataRow joinRows (DataRow r1, DataRow r2)
    {
        DataRow joinRow = new DataRow();
        ///....
        return joinRow;
    }

下面是使用LINQ进行连接的两种方法的示例

        var t1 = new DataTable();
        var t2 = new DataTable();
        t1.Columns.Add("id", typeof (Int32));
        t1.Columns.Add("data", typeof (String));
        t2.Columns.Add("id", typeof (Int32));
        t2.Columns.Add("data", typeof (Int32));

        t1.Rows.Add(new {id=1, data="John"});
        t1.Rows.Add(new {id = 2, data = "Mary"});

        t2.Rows.Add(new {id = 1, data = "100"});
        t2.Rows.Add(new {id = 2, data = "200"});


        var results = from x in t1.Select()
                      join y in t2.Select() on (Int32) x["id"] equals (Int32) y["id"]
                      select (new {id = x["id"], name = x["data"], number = y["data"]});

        var lamdaResults = t1.Select().Join(
            t2.Select(), x => x["id"], y => y["id"],
            (x, y) => new {id=x["id"], name=x["data"], number=y["data"]});

我认为您可能大大低估了所寻找内容的复杂性,但这里有一些代码可以实现这一点,但我将讨论其中的一些主要假设

public DataTable joinTables (DataTable t1, DataTable t2)
{
    DataTable t = new DataTable();
    AddColumns(t1, t);
    AddColumns(t2, t);

    for (int i = 0; i < t1.Rows; i++)
    {
        DataRow newRow = t.NewRow();

        for (int j = 0; j < t1.Columns.Count; j++)
        {
            SetMergedRowValue(t1.Rows[i], newRow, j);
            SetMergedRowValue(t2.Rows[i], newRow, j);
        }

        t.Rows.Add(newRow);
    }

    t.AcceptChanges();
}

private void AddColumns(DataTable source, DataTable target)
{
    foreach (DataColumn c in source.Columns)
    {
        target.Columns.Add(string.Format("{0}_{1}", source.TableName, c.ColumnName), c.DataType);
    }
}

private void SetMergedRowValue(DataRow source, DataRow target, int index)
{
    var columnName = string.Format("{0}_{1}", source.Table.TableName, source.Table.Columns[index]);
    target[columnName] = source[index];
}
公共数据表连接表(数据表t1、数据表t2)
{
DataTable t=新的DataTable();
添加列(t1,t);
添加柱(t2,t);
for(int i=0;i
假设
  • 每个
    DataTable
    具有相同的行数
  • 这些
    DataTable
    对象中的行按照您希望它们按索引合并的顺序进行排序

  • 这些假设是重要的。简言之,尽管这产生了预期的结果,但我不确定你在寻找什么,我也不确定你在寻找什么

    好了,你们这些疯子,我想我已经破解了

    这就是我为我的问题所想到的,在做事情的方式上有点痛苦,但它把两个数据行作为一个数据行,这正是我想要的

    找不到任何默认设置,但请告诉我是否存在

    private DataRow JoinDataRow(DataRow r1, DataRow r2)
    {
        // Get table columns
        var r1Cols = r1.Table.Columns;
        var r2Cols = r2.Table.Columns;
    
        // Create datatable to base row from
        var tempDataTable = new DataTable();
        foreach (DataColumn col in r1Cols)
        {
            tempDataTable.Columns.Add(new DataColumn(col.ColumnName, col.DataType, col.Expression, col.ColumnMapping));
        }
    
        foreach (DataColumn col in r2Cols)
        {
            tempDataTable.Columns.Add(new DataColumn(col.ColumnName, col.DataType, col.Expression, col.ColumnMapping));
        }
    
        // Create new return row to be returned
        DataRow returnRow = tempDataTable.NewRow();
    
        // Fill data
        int count = 0;
        for (int r1Index = 0; r1Index < r1Cols.Count; r1Index ++)
        {
            returnRow[r1Index] = r1[r1Index];
            count++;
        }
    
        for (int r2Index = count; r2Index < r2Cols.Count + count; r2Index++)
        {
            returnRow[r2Index] = r2[r2Index -count];
        }
    
        // Return row
        return returnRow;
    }
    

    基于什么标准?您希望输出是什么样子?@DaveBish标准是不相关的(“如果”)问题在于joinrow()如何将行与行合并为单个行row@iakovl2,
    标准不相关
    简而言之,是错误的。当我有两行谁的模式匹配时,当列值不同时,哪一行获胜?您正在创建一行。@MichaelPerrenoud我错了,我想要一个简单的右/左连接。。。第1行是1232行是456连接是123456@iakovl2那你确定是左/右连接吗?这些类型的联接只从一侧或另一侧获取匹配行,并从相邻一侧获取所有行。看起来你想要交叉连接。你能确认吗?那太大了,我写的程序就像一个散列连接,将datatale拆分为bucket,然后连接它们。这是如果我知道每行中列的类型或计数。但是在我的例子中,我不知道每个表中都有什么(有几个表可供选择),那么就不应该使用术语“join”
    var memberCompanyDetails = 
        (from DataRow member in members.Rows
        join DataRow company in companies.Rows on member["company"] equals company["company"]
        select JoinDataRow(member, company)).AsEnumerable().CopyToDataTable();