Fun Coding

学んだことを記録していきます!

【C#】リストをデータテーブルに変換する方法

リストをデータテーブルに変換する方法を
サンプルコードを交えて解説したいと思います。

説明

・列の追加
① GetPropertiesメソッドでプロパティを取得
② 取得したプロパティの型を取得
③ プロパティと同じ名前と型の列を追加

・行の追加
① GetPropertiesメソッドでプロパティを取得
② 取得したプロパティの値を取得
③ プロパティの値を行に設定
④ 行を追加

ポイント

・GetUnderlyingTypeメソッドを使うことでNULL 許容型の基になる型を取得できる
・プロパティの値がnullの場合はデータテーブルにはDBNullを設定する


データテーブルをリストに変換したい場合は以下を参考にしてください。
funcording.hatenablog.com

コード
using System;
using System.Collections.Generic;
using System.Data;
using System.Reflection;

namespace Sample {
    /// <summary>
    /// メインプログラム
    /// </summary>
    public class Program {
        /// <summary>
        /// リストをデータテーブルに変換
        /// </summary>
        static void Main() {
            // リストの生成
            var personList = new List<Person>() {
                new Person() { Name = "一郎", Age = 10},
                new Person() { Name = "二郎", Age = 20},
                new Person() { Name = "三郎", Age = null}
            };



            // テーブルの生成
            var table = new DataTable();

            // 列の追加
            foreach(PropertyInfo property in typeof(Person).GetProperties()) {
                // 型を取得
                var type = Nullable.GetUnderlyingType(property.PropertyType) ?? property.PropertyType;
                // 追加
                table.Columns.Add(property.Name, type);
            }

            // 行の追加
            foreach(var person in personList) {
                // 行の作成
                DataRow row = table.NewRow();
                // 値を設定
                foreach(PropertyInfo property in typeof(Person).GetProperties()) {
                    var value = property.GetValue(person, null) ?? DBNull.Value;
                    row[property.Name] = value;
                }
                // 追加
                table.Rows.Add(row);
            }


            // 列を出力
            Console.WriteLine("列");
            foreach(DataColumn dataColumn in table.Columns) {
                Console.WriteLine("列名 : " + dataColumn.ColumnName + "、 型 : " + dataColumn.DataType);
            }
            Console.WriteLine();

            // 行を出力
            Console.WriteLine("行");
            foreach(DataRow dataRow in table.Rows) {
                Console.WriteLine("名前 : " + dataRow[0] + "、 年齢 : " + dataRow[1]);
            }
            Console.WriteLine();
        }
    }

    /// <summary>
    /// 人間テーブルのエンティティクラス
    /// </summary>
    public class Person {
        /// <summary>
        /// 名前を取得/設定
        /// </summary>
        public string? Name {
            get;
            set;
        }

        /// <summary>
        /// 年齢を取得/設定
        /// </summary>
        public int? Age {
            get;
            set;
        }
    }
}
出力
列
列名 : Name、 型 : System.String
列名 : Age、 型 : System.Int32

行
名前 : 一郎、 年齢 : 10
名前 : 二郎、 年齢 : 20
名前 : 三郎、 年齢 :