DataTableからリスト(List)に変換する時のパフォーマンスを比較して見ました。
比較したのはJsonConvertクラスのSerializeとDeserializeメソッドでリストにコンバート、
とリフレクションでリストにコンバートです。

先ずは100列、5000行があるDataTableを作りましょう。
[csharp]
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);
}
[/csharp]

DataTableのColumns.Addを使ってカラムを追加、NewRow()メソッドで行を作成します。

JsonConvertを利用してリストにコンバートして見ましょう。
JsonConvert.DeserializeObject>(JsonConvert.SerializeObject(dt));
5000件だと約1.8秒がかかりますね。

では、リフレクションで変換します。
[csharp]
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();

}
[/csharp]
結果は約1.1秒です。
CPUよりスピードがかわると思いますが、まあ、リフレクションのほうが速いことが分かりました。
大体2倍弱速いですね。

リストからDataTableに変換する

リストからデータテーブルに変換する方法です。
上記メソッドの逆バージョンですね。
[csharp]
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;
}
[/csharp]

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です