集合转换类

集合转换类,主要是将list转换为table,将table转换为list等等

using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Reflection;

namespace SEAEYE.WEB2._0.component
{
    /// <summary>
    /// 集合转换类
    /// </summary>
    public class CollectionConversion
    {
        public static class Convert<T> where T : new()
        {
            /// <summary>  
            /// DataTable 2 list
            /// </summary>  
            /// <param name="dt"></param>  
            /// <returns></returns>  
            public static List<T> ToList(DataTable dt)
            {

                // 定义集合  
                List<T> ts = new List<T>();

                // 获得此模型的类型  
                Type type = typeof(T);
                //定义一个临时变量  
                //遍历DataTable中所有的数据行  
                foreach (DataRow dr in dt.Rows)
                {
                    T t = new T();
                    // 获得此模型的公共属性  
                    PropertyInfo[] propertys = t.GetType().GetProperties();
                    //遍历该对象的所有属性  
                    foreach (PropertyInfo pi in propertys)
                    {
                        string tempName = pi.Name;
                        //检查DataTable是否包含此列(列名==对象的属性名)    
                        if (dt.Columns.Contains(tempName))
                        {
                            // 判断此属性是否有Setter  
                            if (!pi.CanWrite) continue;//该属性不可写,直接跳出  
                            //取值  
                            object value = dr[tempName];
                            //如果非空,则赋给对象的属性  
                            if (value != DBNull.Value)
                                pi.SetValue(t, value, null);
                        }
                    }
                    //对象添加到泛型集合中  
                    ts.Add(t);
                }
                return ts;
            }

            /// <summary>    
            /// List 2 DataTable    
            /// </summary>    
            /// <typeparam name="T"></typeparam>    
            /// <param name="list"></param>    
            /// <returns></returns>    
            public static DataTable ToDataTable(IEnumerable<T> list)
            {
                List<PropertyInfo> pList = new List<PropertyInfo>(); // 创建属性的集合   


                Type type = typeof(T); // 获得反射的入口    
                DataTable dt = new DataTable();

                // 把所有的public属性加入到集合 并添加DataTable的列    
                Array.ForEach(type.GetProperties(), p => { pList.Add(p); dt.Columns.Add(p.Name, p.PropertyType); });
                foreach (var item in list)
                {
                    DataRow row = dt.NewRow();// 创建一个DataRow实例    

                    pList.ForEach(p => row[p.Name] = p.GetValue(item, null));  // 给row 赋值    

                    dt.Rows.Add(row); // 加入到DataTable    
                }
                return dt;
            }

        }

        /// <summary>
        /// 自动进行列数值统计
        /// </summary>
        /// <param name="dt">要统计的 DataTable </param>
        /// <param name="columnNames">name1,name2,name3</param>
        /// <returns></returns>
        public static DataTable StatisticsDt(DataTable dt, string columnNames)
        {
            if (columnNames == "") return dt; // 如果为空,则返回原始数据源
            dt = SetDataTableColumnTypeToString(dt);
            try
            {
                DataRow dr = dt.NewRow();
                decimal num;
                dr[0] = Style("合计");
                if (columnNames.Contains(",")) // 多个列名使用逗号分隔
                {
                    IList<string> names = columnNames.Split(',');
                    foreach (string s in names.Where(it => it != ""))
                    {
                        num = dt.AsEnumerable().Sum(x => Convert.ToDecimal(x[s])); // 不使用 Compute 计算,保证类型正确
                        dr[dt.Columns.IndexOf(s)] = Style(num.ToString("N")); // 获取列对应的索引位置,保证合计值存放到对应的列底部
                    }
                }
                else  // 同上 
                {
                    num = dt.AsEnumerable().Sum(x => Convert.ToDecimal(x[columnNames]));
                    dr[dt.Columns.IndexOf(columnNames)] = Style(num.ToString("N"));
                }

                dt.Rows.Add(dr);
            }
            catch (Exception)
            {
                return dt;
            }
            return dt;
        }

        /// <summary>
        /// 样式格式化
        /// </summary>
        /// <param name="font"></param>
        /// <returns></returns>
        private static string Style(string font)
        {
            return string.Format("<span style='color:red;'>{0}</span>", font);
        }

        /// <summary>
        /// 设置 DataTable 列类型为 String
        /// </summary>
        /// <param name="dt"></param>
        /// <returns></returns>
        public static DataTable SetDataTableColumnTypeToString(DataTable dt)
        {
            if (dt.Rows.Count == 0) return dt;
            try
            {
                DataTable newDt = dt.Clone(); // 复制表结构

                foreach (DataColumn col in newDt.Columns) // 重置类型为 String
                {
                    col.DataType = Type.GetType("System.String");
                }

                foreach (DataRow dr in dt.Rows)
                {
                    DataRow newRow = newDt.NewRow();
                    foreach (DataColumn col in dt.Columns)
                    {
                        newRow[col.ColumnName] = dr[col.ColumnName];
                    }

                    newDt.Rows.Add(newRow);
                }

                return newDt;
            }
            catch (Exception)
            {
                return dt;
            }


        }

        /// <summary>
        /// 快速统计 List 
        /// </summary>
        /// <remarks>不可自定义数据类型</remarks>
        /// <param name="list"></param>
        /// <param name="columnNames"></param>
        /// <returns></returns>
        public static List<T> QuickStatisticsForList<T>(IEnumerable<T> list, string columnNames) where T : new()
        {
            return Convert<T>.ToList(StatisticsDt(Convert<T>.ToDataTable(list), columnNames));
        }

        /// <summary>
        /// 快速统计 DataTable
        /// </summary>
        /// <remarks>支持单元格各种格式修改</remarks>
        /// <param name="list"></param>
        /// <param name="columnNames"></param>
        /// <returns></returns>
        public static DataTable QuickStatisticsForDataTable<T>(IEnumerable<T> list, string columnNames) where T : new()
        {
            return StatisticsDt(Convert<T>.ToDataTable(list), columnNames);
        }
    }
}

 

posted @ 2018-01-09 10:12  zfylzl  阅读(255)  评论(0编辑  收藏  举报