【C#】自作classのListをDataTableに変換する処理【現場の備忘録】

プログラム

以前、「DataTable→自作classのList」に変換する処理について記事にしたので、その逆である「自作classのList→DataTable」も記事に残しておこうかと。

DataTableへの変換処理

    /// <summary>
    /// DataTableへの変換処理
    /// (List内のNullデータは考慮しない)
    /// </summary>
    /// <param name="item">任意の自作classのList型データ</param>
    /// <returns></returns>
    public static DataTable ToDataTable<T>(List<T> list)
    {
        DataTable table = new DataTable();

        // テーブルのcolumn作成
        typeof(T).GetProperties().ToList().ForEach(
            p => table.Columns.Add(p.Name, p.PropertyType)
            );

        foreach (var item in list)
        {
            // DataRowに変換しテーブルに追加していく
            DataRow row = ToDataRow(item, table);
            table.Rows.Add(row);
        }
        return table;
    }
    /// <summary>
    /// DataRowへの変換処理
    /// </summary>
    /// <param name="item">任意のclass型データ</param>
    /// <param name="targetTable">DataRowが属するテーブルを指定したい場合は入力</param>
    /// <returns></returns>
    public static DataRow ToDataRow<T>(T item, DataTable targetTable = null!)
    {
        if (targetTable == null)
        {
            targetTable = new DataTable();
        }

        if (targetTable.Columns.Count == 0)
        {
            // テーブルのcolumn作成
            typeof(T).GetProperties().ToList().ForEach(
                p => targetTable.Columns.Add(p.Name, p.PropertyType)
                );
        }

        // 作成したcolumnに値を入れていく
        DataRow row = targetTable.NewRow();
        typeof(T).GetProperties().ToList().ForEach(
            p => row[p.Name] = p.GetValue(item, null)
            );

        return row;
    }

やっていることはコメントで書いてある通り。

コピペですぐ使えます。

注意点は…とくにないと思います。

ListからDataTableにしたい場合は「 ToDataTable<T>(List<T> list)」

class単体からDataTableにしたい場合は「ToDataRow<T>(T item, DataTable targetTable = null!)」

それぞれ使用してください。

実装例

下記の例はVisualStudio2022.Net8.0、作成プロジェクトはコンソールアプリ、OSはWindows11で実装。

Program.csとEntity.csのクラスファイルを作成してもらえればあとはコピペで確認できるはず。

処理としては 「CreateTestLst()」で自作classのListデータを作成してから、今回紹介した変換処理「ToDataTable(entityList)」でDataTableに変換しています。

Program.cs
using System.Data;

public class Program() 
{
    private static void Main() 
    {
        // テスト用のリストを作成
        List<Entity> entityList = CreateTestLst();
        // データテーブル用意
        DataTable dt = new DataTable();

        // 自作classlistをDataTableに変換
        dt = ToDataTable(entityList);

        // コンソールへの表示
        foreach (DataRow row in dt.Rows)
        {
            string rowText = string.Empty;

            for (int i = 0; i < row.ItemArray.Length; i++)
            {
                rowText += $"{row[i].ToString()}  ";
            }

            Console.WriteLine(rowText);
        }
    }
    /// <summary>
    /// テスト用のList作成
    /// </summary>
    /// <returns></returns>
    public static List<Entity> CreateTestLst() 
    {
        List<Entity> rtnList = new List<Entity>();

        Entity entity = new Entity();

        entity.TOSHI_NO = 1;
        entity.HINMEI = "りんご";
        entity.JYURYO = (decimal)1.1;
        entity.IRISU = 3;
        entity.NYUKO_YMD = "20240101";
        entity.SHUKKO_YMD = "20240110";

        rtnList.Add(entity);

        return rtnList;
    }
    /// <summary>
    /// DataTableへの変換処理
    /// (List内のNullデータは考慮しない)
    /// </summary>
    /// <param name="item">任意の自作classのList型データ</param>
    /// <returns></returns>
    public static DataTable ToDataTable<T>(List<T> list)
    {
        DataTable table = new DataTable();

        // テーブルのcolumn作成
        typeof(T).GetProperties().ToList().ForEach(
            p => table.Columns.Add(p.Name, p.PropertyType)
            );

        foreach (var item in list)
        {
            // DataRowに変換しテーブルに追加していく
            DataRow row = ToDataRow(item, table);
            table.Rows.Add(row);
        }
        return table;
    }
    /// <summary>
    /// DataRowへの変換処理
    /// </summary>
    /// <param name="item">任意のclass型データ</param>
    /// <param name="targetTable">DataRowが属するテーブルを指定したい場合は入力</param>
    /// <returns></returns>
    public static DataRow ToDataRow<T>(T item, DataTable targetTable = null!)
    {
        if (targetTable == null)
        {
            targetTable = new DataTable();
        }

        if (targetTable.Columns.Count == 0)
        {
            // テーブルのcolumn作成
            typeof(T).GetProperties().ToList().ForEach(
                p => targetTable.Columns.Add(p.Name, p.PropertyType)
                );
        }

        // 作成したcolumnに値を入れていく
        DataRow row = targetTable.NewRow();
        typeof(T).GetProperties().ToList().ForEach(
            p => row[p.Name] = p.GetValue(item, null)
            );

        return row;
    }
}
Entity.cs
/// <summary>
/// 自作クラス作成
/// </summary>
public class Entity
{
    public Entity()
    {
        Initialize();
    }

    public int TOSHI_NO { get; set; } = 0;
    public string HINMEI { get; set; } = string.Empty;
    public decimal JYURYO { get; set; } = 0;
    public int IRISU { get; set; } = 0;
    public string NYUKO_YMD { get; set; } = string.Empty;
    public string SHUKKO_YMD { get; set; } = string.Empty;

    public void Initialize() 
    {
        TOSHI_NO = 0;
        HINMEI = string.Empty;
        JYURYO = 0;
        IRISU = 0;
        NYUKO_YMD = string.Empty;
        SHUKKO_YMD = string.Empty;
    }
}

さいごに

プログラム内の操作ではListの方が使いやすい。

ただExcel出力や帳票作成ライブラリがDataTableを入力として要求する場合があったり、古いコンポーネントやライブラリがDataTableのみをサポートしている場合があったりします。

そういった際に今回紹介したListからDataTableへの変換処理が必要になります。

コメント

タイトルとURLをコピーしました