DataTableToList 转换为List 转化为List
using System;
using System.Collections.Generic;
using System.Data;
using System.Diagnostics;
using System.Linq;
using System.Reflection;
using NUnit.Framework;
namespace NunitTest.BasicTest
{
class DataTableToList : SpecificationBase
{
[Test]
public void DataTableToListTest()
{
var dt = new DataTable();
dt.Columns.Add("Id", typeof(int));
dt.Columns.Add("Name", typeof(string));
dt.Columns.Add("Email", typeof(string));
dt.Columns.Add("Age", typeof(int));
for (int i = 0; i < 100; i++)
{
var row = dt.NewRow();
row["Id"] = i;
row["Name"] = "Name" + i;
row["Email"] = "Email" + i;
row["Age"] = 20 + i;
dt.Rows.Add(row);
}
var list = ConvertTo<User>(dt);
foreach (var item in list)
{
string.Format("row:===>{0}\t{1}\t{2}\t{3}", item.Id, item.Name, item.Email, item.Age).NUnitOutput();
}
}
[Test]
public void DataTableToListTest2()
{
var dt = new DataTable();
dt.Columns.Add("Id", typeof(int));
dt.Columns.Add("Name", typeof(string));
dt.Columns.Add("Email", typeof(string));
dt.Columns.Add("Age", typeof(int));
for (int i = 0; i < 999; i++)
{
var row = dt.NewRow();
row["Id"] = i;
row["Name"] = "Name" + i;
row["Email"] = "Email" + i;
row["Age"] = 20 + i;
dt.Rows.Add(row);
}
Stopwatch stopwatch = Stopwatch.StartNew();
var list = ToList<User>(dt);
stopwatch.Stop();
stopwatch.ElapsedTicks.NUnitOutput();
foreach (var item in list)
{
string.Format("row:===>{0}\t{1}\t{2}\t{3}", item.Id, item.Name, item.Email, item.Age).NUnitOutput();
}
}
#region 非测试方法
private List<T> ToList<T>(DataTable dt) where T : class, new()
{
List<T> listReturn = new List<T>();
List<PropertyInfo> properties = new List<PropertyInfo>();
Array.ForEach(typeof(T).GetProperties(), p => { if (dt.Columns.IndexOf(p.Name) != -1)properties.Add(p); });
foreach (DataRow row in dt.Rows)
{
T newObj = new T();
foreach (PropertyInfo info in properties)
{
if (row[info.Name] != DBNull.Value)
{
info.SetValue(newObj, row[info.Name], null);
}
}
listReturn.Add(newObj);
}
return listReturn;
}
private List<T> ConvertTo<T>(DataTable dt) where T : new()
{
var list = new List<T>();
try
{
var ColumnNames = new List<string>();
foreach (DataColumn column in dt.Columns)
{
ColumnNames.Add(column.ColumnName);
}
PropertyInfo[] propertyInfos;
propertyInfos = typeof(T).GetProperties();
list = dt.AsEnumerable().ToList().ConvertAll<T>(x => GetObject<T>(x, ColumnNames, propertyInfos));
}
catch (Exception)
{
}
return list;
}
private T GetObject<T>(DataRow row, List<string> ColumnNames, PropertyInfo[] propertyInfos) where T : new()
{
T obj = new T();
try
{
string columnname = "";
string value = "";
foreach (var objProperty in propertyInfos)
{
columnname = ColumnNames.Find(name => name.ToLower() == objProperty.Name.ToLower());
if (string.IsNullOrEmpty(columnname))
{
value = row[columnname].ToString();
if (!string.IsNullOrEmpty(value))
{
if (Nullable.GetUnderlyingType(objProperty.GetType()) != null)
{
value = row[columnname].ToString().Replace("$", "").Replace(",", "");
objProperty.SetValue(obj, Convert.ChangeType(value, Type.GetType(Nullable.GetUnderlyingType(objProperty.PropertyType).ToString())), null);
}
else
{
value = row[columnname].ToString().Replace("%", "");
objProperty.SetValue(obj, Convert.ChangeType(value, Type.GetType(objProperty.PropertyType.ToString())), null);
}
}
}
}
return obj;
}
catch (Exception)
{
}
return default(T);
}
internal class User
{
public int Id { get; set; }
public string Name { get; set; }
public string Email { get; set; }
public int Age { get; set; }
}
#endregion
}
}