DataTableからリスト(List)に変換する時のパフォーマンスを比較して見ました。
比較したのはJsonConvertクラスのSerializeとDeserializeメソッドでリストにコンバート、
とリフレクションでリストにコンバートです。
先ずは100列、5000行があるDataTableを作りましょう。
var dt = new DataTable(); for (var i = 1; i <= 100; i++) { dt.Columns.Add("Column" + i.ToString()); } for (var j = 0; j < 5000; j++) { var dr = dt.NewRow(); for (var i = 1; i <= 100; i++) { dr["Column" + i.ToString()] = "abcdefghijklmnopqrstuvwxyz"; } dt.Rows.Add(dr); }
DataTableのColumns.Addを使ってカラムを追加、NewRow()メソッドで行を作成します。
JsonConvertを利用してリストにコンバートして見ましょう。
JsonConvert.DeserializeObject>(JsonConvert.SerializeObject(dt));
5000件だと約1.8秒がかかりますね。
では、リフレクションで変換します。
private List<T> ConvertToList<T>(DataTable dt) { var columnNames = dt.Columns.Cast<DataColumn>() .Select(c => c.ColumnName) .ToList(); var properties = typeof(T).GetProperties(); return dt.AsEnumerable().Select(row => { var objT = Activator.CreateInstance<T>(); foreach (var pro in properties) { if (columnNames.Contains(pro.Name)) pro.SetValue(objT, row[pro.Name]); } return objT; }).ToList(); }
結果は約1.1秒です。
CPUよりスピードがかわると思いますが、まあ、リフレクションのほうが速いことが分かりました。
大体2倍弱速いですね。
リストからDataTableに変換する
リストからデータテーブルに変換する方法です。
上記メソッドの逆バージョンですね。
private DataTable CreateDataTable<T>(IEnumerable<T> list) { Type type = typeof(T); var properties = type.GetProperties(); DataTable dataTable = new DataTable(); foreach (PropertyInfo info in properties) { dataTable.Columns.Add(new DataColumn(info.Name, info.PropertyType)); } foreach (T entity in list) { object[] values = new object[properties.Length]; for (int i = 0; i < properties.Length; i++) { values[i] = properties[i].GetValue(entity); } dataTable.Rows.Add(values); } return dataTable; }