For my own edification, I decided to check the comparative speeds of DataTable.ImportRow and DataTable.Merge. I found that DataTable.ImportRow was significantly slower than DataTable.Merge. In rare cases, both functions had equal processing times. In rare cases, ImportRow was faster than Merge.
Below are the test results and code.
- Why is ImportRow slower than Merge?
- What makes Merge faster?

DataTable dt = new DataTable(); dt.Columns.Add("customerId", typeof(int)); dt.Columns.Add("username", typeof(string)); for (int i = 0; i <= 100000; i++) { DataRow myNewRow; myNewRow = dt.NewRow(); myNewRow["customerId"] = 1; myNewRow["username"] = "johndoe"; dt.Rows.Add(myNewRow); }
Edit: updated code as recommended -
DataTable dt = new DataTable(); dt.Columns.Add("customerId", typeof(int)); dt.Columns.Add("username", typeof(string)); DataColumn[] key = new DataColumn[1]; key[0] = dt.Columns[0]; dt.PrimaryKey = key; for (int i = 0; i <= 100000; i++) { DataRow myNewRow; myNewRow = dt.NewRow(); myNewRow["customerId"] = i; myNewRow["username"] = "johndoe"; dt.Rows.Add(myNewRow); } // First Duration //DateTime startTime1 = DateTime.Now; Stopwatch sw1 = new Stopwatch(); sw1.Start(); DataTable dt2 = new DataTable(); dt2 = dt.Clone(); for (int i = 0; i < dt.Rows.Count; i++) dt2.ImportRow(dt.Rows[i]); //DateTime stopTime1 = DateTime.Now; sw1.Stop(); // End First Duration TimeSpan duration1 = sw1.Elapsed; // Second Duration //DateTime startTime2 = DateTime.Now; Stopwatch sw2 = new Stopwatch(); sw2.Start(); DataTable dt3 = new DataTable(); dt3 = dt.Clone(); dt3.Merge(dt); sw2.Stop(); //DateTime stopTime2 = DateTime.Now; // End Second Duration TimeSpan duration2 = sw2.Elapsed; label3.Text = duration1.Milliseconds.ToString(); label4.Text = duration2.Milliseconds.ToString();

user195488
source share