Try this ...
I created tables similar to those you have in your post
DataTable table1 = new DataTable();
DataTable table2 = new DataTable();
table1.Columns.Add("1", typeof(string));
table1.Columns.Add("3", typeof(string));
table1.Columns.Add("5", typeof(string));
table2.Columns.Add("2", typeof(string));
table2.Columns.Add("4", typeof(string));
table2.Columns.Add("6", typeof(string));
Then I created a datatable to hold the results
DataTable dtResult = new DataTable();
dtResult.Columns.Add("1", typeof(string));
dtResult.Columns.Add("2", typeof(string));
dtResult.Columns.Add("3", typeof(string));
dtResult.Columns.Add("4", typeof(string));
dtResult.Columns.Add("5", typeof(string));
dtResult.Columns.Add("6", typeof(string));
I then take advantage of the fact that DataTable can be converted to a queryable object
var t1 = table1.AsEnumerable();
var t2 = table2.AsEnumerable();
I had to make the assumption that the "row number" was the way to join the two tables and used this to populate the result
var result = from dataRows1 in t1
join dataRows2 in t2
on table1.Rows.IndexOf(dataRows1) equals table2.Rows.IndexOf(dataRows2) into lj
from r in lj.DefaultIfEmpty()
select (new object[]
{
dataRows1.Field<string>("1"),
r.Field<string>("2"),
dataRows1.Field<string>("3"),
r.Field<string>("4"),
dataRows1.Field<string>("5"),
r.Field<string>("6")
});
foreach (var x in result)
dtResult.Rows.Add(x);
In summary - I used a
Left Join[
^] on the tables and selected the columns I needed in the order you required