public Class1() { DataTable PCR; DataTable NGS; //Read in PCR files var filesPCR = Directory.EnumerateFiles("path", "PCR*.csv"); foreach (string file in files) { using (FileStream fs = new FileStream(file, FileMode.Open, FileAccess.Read)) { DataAdapter.fill(ReadCSVFile(file), "PCR"); } } var filesNGS = Directory.EnumerateFiles("path", "NGS*.csv"); foreach (string file in files) { using (FileStream fs = new FileStream(file, FileMode.Open, FileAccess.Read)) { DataAdapter.fill(ReadCSVFile(file), "NGS"); } // merge tables } ////////////////// now merge the two data tables /// // set primary keys of tables NGS.PrimaryKey = new DataColumn[] { idColumn }; PCR.PrimaryKey = new DataColumn[] { idColumn }; DataTable Merged; // merge the two tables. using linQ var result = from dataRows1 in PCR.AsEnumerable() join dataRows2 in NGS.AsEnumerable() on dataRows1.Field<string>("ID") equals dataRows2.Field<string>("ID") select dtResult.LoadDataRow(new object[] { dataRows1.Field<string>("ID"), dataRows1.Field<string>("name"), dataRows2.Field<int>("etc"), }, false); }