lenya
9/8/2017 - 3:21 AM

DataTableToListTest

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

    }

}