向DataTable添加多行

我知道有两种方法可以将新行与数据添加到DataTable

 string[] arr2 = { "one", "two", "three" }; dtDeptDtl.Columns.Add("Dept_Cd"); 

 for (int a = 0; a < arr2.Length; a++) { DataRow dr2 = dtDeptDtl.NewRow(); dr2["Dept_Cd"] = DeptCd[a]; dtDeptDtl.Rows.Add(dr2); } 

 for (int a = 0; a < arr2.Length; a++) { dtDeptDtl.Rows.Add(); dtDeptDtl.Rows[a]["Dept_Cd"] = DeptCd[a]; } 

上述两种方法都会给我相同的结果,即OneTable中的One Two Three将在单独的行中添加。

但我的问题是,两个步骤之间有什么区别,哪个是更好的表现方式?

一些反编译观察

在这两种情况下,都使用System.Data.DataRowCollection.Add方法的不同重载。

第一种方法使用:

 public void Add(DataRow row) { this.table.AddRow(row, -1); } 

第二种方法将使用:

 public DataRow Add(params object[] values) { int record = this.table.NewRecordFromArray(values); DataRow dataRow = this.table.NewRow(record); this.table.AddRow(dataRow, -1); return dataRow; } 

现在,看看这个小野兽:

 internal int NewRecordFromArray(object[] value) { int count = this.columnCollection.Count; if (count < value.Length) { throw ExceptionBuilder.ValueArrayLength(); } int num = this.recordManager.NewRecordBase(); int result; try { for (int i = 0; i < value.Length; i++) { if (value[i] != null) { this.columnCollection[i][num] = value[i]; } else { this.columnCollection[i].Init(num); } } for (int j = value.Length; j < count; j++) { this.columnCollection[j].Init(num); } result = num; } catch (Exception e) { if (ADP.IsCatchableOrSecurityExceptionType(e)) { this.FreeRecord(ref num); } throw; } return result; } 

特别要注意this.columnCollection[i][num] = value[i]; ,将致电:

 public DataColumn this[int index] { get { DataColumn result; try { result = (DataColumn)this._list[index]; } catch (ArgumentOutOfRangeException) { throw ExceptionBuilder.ColumnOutOfRange(index); } return result; } } 

继续前进,我们发现_list实际上是一个ArrayList

 private readonly ArrayList _list = new ArrayList(); 

结论

为了总结上述内容,如果您使用的是dtDeptDtl.Rows.Add(); 而不是dtDeptDtl.Rows.Add(dr2); 随着列数的增加, 性能会下降 ,并会呈指数级增长。 降级的负责行是调用NewRecordFromArray方法,该方法遍历ArrayList

注意:如果您向表中添加8列,并在for循环1000000次中进行一些测试,则可以轻松测试。