0

DataTableとリストの互換、パフォーマンス計測

LINEで送る
Pocket

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;
}
LINEで送る
Pocket

管理者

コメントを残す

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