zoukankan      html  css  js  c++  java
  • 集合转换类

    集合转换类,主要是将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);
            }
        }
    }
  • 相关阅读:
    .Net魔法堂:史上最全的ActiveX开发教程——发布篇
    .Net魔法堂:史上最全的ActiveX开发教程——开发篇
    JS魔法堂:浏览器模式和文档模式怎么玩?
    JS魔法堂:精确判断IE的文档模式by特征嗅探
    JS魔法堂:追忆那些原始的选择器
    意译:自调用函数表达式
    一起Polyfill系列:让Date识别ISO 8601日期时间格式
    一起Polyfill系列:Function.prototype.bind的四个阶段
    poco 线程库
    CDN理解<转>
  • 原文地址:https://www.cnblogs.com/zfylzl/p/8250039.html
Copyright © 2011-2022 走看看