IEnumerableとDataTableの互換性
2022-02-23 19:44:49
/// <summary>
/// Converting a DataTable to a List collection
/// </summary>
/// <typeparam name="TResult">type</typeparam>
/// <param name="dt">DataTable</param>
/// <returns></returns>
public static List<TResult> ToList<TResult>(DataTable dt) where TResult : class, new()
{
// Create a list of properties
List<PropertyInfo> prlist = new List<PropertyInfo>();
//Get an instance of the type of TResult Entry point for reflection
Type t = typeof(TResult);
//Get all the Public properties of TResult and find out which TResult property has the same name as the DataTable's column (PropertyInfo) and add it to the property list
Array.ForEach<PropertyInfo>(t.GetProperties(), p => { if (dt.Columns.IndexOf(p.Name) ! = -1) prlist.Add(p); });
// Create the returned collection
List<TResult> oblist = new List<TResult>();
foreach (DataRow row in dt.Rows)
{
// Create an instance of TResult
TResult ob = new TResult();
//find the corresponding data and assign it a value
prlist.ForEach(p => { if (row[p.Name] ! = DBNull.Value) p.SetValue(ob, row[p.Name], null); });
//put into the returned collection.
oblist.Add(ob);
}
return oblist;
}
/// <summary>
//// Convert to a DataTable
/// </summary>
/// <typeparam name="TResult"></typeparam>
/// <param name="value"></param>
/// <returns></returns>
public static DataTable ToDataTable(IEnumerable list)
{
// Create a collection of properties
List<PropertyInfo> pList = new List<PropertyInfo>();
//Get the entry point for reflection
Type type = list.AsQueryable().ElementType;
DataTable dt = new DataTable();
// Add all the public properties to the collection and add the columns of the DataTable
Array.ForEach<PropertyInfo>(type.GetProperties(), p => { pList.Add(p); dt.Columns.Add(p.Name, p.PropertyType); });
foreach (var item in list)
{
// Create a DataRow instance
DataRow row = dt.NewRow();
//assign a value to row
pList.ForEach(p => row[p.Name] = p.GetValue(item, null));
// Add to DataTable
dt.Rows.Add(row);
}
return dt;
}
/// <summary>
//// Convert to a DataTable
/// </summary>
/// <typeparam name="TResult"></typeparam>
/// <param name="value"></param>
/// <returns></returns>
public static DataTable ToDataTable<TResult>(IEnumerable<TResult> value) where TResult : class
{
// Create a collection of properties
List<PropertyInfo> pList = new List<PropertyInfo>();
//Get the entry point for reflection
Type type = typeof(TResult);
DataTable dt = new DataTable();
//add all the public properties to the collection and add the columns of the DataTable
Array.ForEach<PropertyInfo>(type.GetProperties(), p => { pList.Add(p); dt.Columns.Add(p.Name, p.PropertyType); });
foreach (var item in value)
{
// Create a DataRow instance
DataRow row = dt.NewRow();
//assign a value to row
pList.ForEach(p => row[p.Name] = p.GetValue(item, null));
// Add to DataTable
dt.Rows.Add(row);
}
return dt;
}
関連
-
[解決済み] Python (2.x) リスト / サブリスト選択 -1 の不具合
-
[解決済み] Prolog-リストを繰り返し実行する
-
[解決済み] list_for_each_entry と list_for_each_entry_safe について説明する。
-
[解決済み] Ocaml: list.lengthを使用する。
-
[解決済み] Prolog リストから要素を削除する
-
[解決済み] Haskellでelemを使わずにリストから重複を削除する
-
[解決済み] Prologでリストを平坦にする
-
[解決済み] ScalaのSeqとListの違いについて
-
[解決済み] OCaml標準ライブラリ関数によるリストの並べ替え
-
ERROR:バイナリへのオペランドが無効です。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Haskellを学ぶ。HaskellでListからアイテムを削除する方法
-
[解決済み】Prologでリストを反転させる
-
[解決済み] Python (2.x) リスト / サブリスト選択 -1 の不具合
-
[解決済み] TypeError: リストのインデックスは整数でなければならず、floatではない
-
[解決済み] Prologにおける"!"とは
-
[解決済み] リストに指定されたメンバが含まれているかどうかを判断するルールを定義する
-
[解決済み] PrologでListの要素をプリントアウトする
-
[解決済み] リスト内の連続した重複を識別する最もPythonicな方法は何でしょうか?
-
error C2955: 'std::list' : クラステンプレートの使用にはテンプレート引数のリストが必要です。