zoukankan      html  css  js  c++  java
  • C# DataTable,DataSet,IList,IEnumerable 互转扩展属性

    using System;
    using System.Collections.Generic;
    using System.Data;
    using System.Linq;
    using System.Reflection;
    using System.Collections;
    namespace XHSoft.LicenseManagerUI
    {
        /// <summary>
        /// 扩展属性
        /// </summary>
        public static class Extensions
        {
            #region 数据集转换泛型集合扩展
            /// <summary>         
            /// DataSet转换为泛型集合         
            /// </summary>         
            /// <typeparam name="T">泛型类型</typeparam>         
            /// <param name="ds">DataSet数据集</param>         
            /// <param name="tableIndex">待转换数据表索引,默认第0张表</param>         
            /// <returns>返回泛型集合</returns>         
            public static IList<T> ToList<T>(this DataSet ds, int tableIndex = 0)
            {
                if (ds == null || ds.Tables.Count < 0) return null;
                if (tableIndex > ds.Tables.Count - 1)
                    return null;
                if (tableIndex < 0)
                    tableIndex = 0;
                DataTable dt = ds.Tables[tableIndex];
                // 返回值初始化             
                IList<T> result = new List<T>();
                for (int j = 0; j < dt.Rows.Count; j++)
                {
                    T _t = (T)Activator.CreateInstance(typeof(T));
                    PropertyInfo[] propertys = _t.GetType().GetProperties();
                    foreach (PropertyInfo pi in propertys)
                    {
                        for (int i = 0; i < dt.Columns.Count; i++)
                        {
                            // 属性与字段名称一致的进行赋值                         
                            if (pi.Name.Equals(dt.Columns[i].ColumnName))
                            {
                                // 数据库NULL值单独处理                             
                                if (dt.Rows[j][i] != DBNull.Value)
                                    pi.SetValue(_t, dt.Rows[j][i], null);
                                else
                                    pi.SetValue(_t, null, null);
                                break;
                            }
                        }
                    }
                    result.Add(_t);
                }
                return result;
            }
            /// <summary>         
            /// DataTable转换为泛型集合         
            /// </summary>         
            /// <typeparam name="T">泛型类型</typeparam>         
            /// <param name="dt">DataTable数据表</param>         
            /// <returns>返回泛型集合</returns>         
            public static IList<T> ToList<T>(this DataTable dt) where T:class,new()
            {
                if (dt == null || dt.Rows.Count <= 0) return null;
                List<T> list =new List<T>();
                #region 方法一:
                //T model;
                //Type infos = typeof(T);
                ////object tempValue;
                //foreach (DataRow dr in dt.Rows)
                //{
                //    model = new T();
                //    1.
                //    infos.GetProperties().ToList().ForEach(p =>p.SetValue(model, dr[p.Name], null));
                //     2.
                //    //infos.GetProperties().ToList().ForEach(p =>
                //    //{
                //    //    tempValue = dr[p.Name];
                //    //    if (!string.IsNullOrEmpty(tempValue.ToString()))
                //    //        p.SetValue(model, tempValue, null);
                //    //});
                //    list.Add(model);
                //}
                #endregion
                #region 方法二:    比方法一快
                PropertyInfo[] propertys = typeof(T).GetProperties();
                for (int j = 0; j < dt.Rows.Count; j++)
                {
                    T _t = (T)Activator.CreateInstance(typeof(T));
                    foreach (PropertyInfo pi in propertys)
                    {
                        // 属性与字段名称一致的进行赋值                         
                        if (pi.Name.Equals(dt.Columns[pi.Name].ColumnName))
                        {
                            if (dt.Rows[j][pi.Name] != DBNull.Value)
                                pi.SetValue(_t, dt.Rows[j][pi.Name], null);
                            else
                                pi.SetValue(_t, null, null);
                        }
                    }
                    list.Add(_t);
                }
                #endregion
                return list;
            }
            /// <summary>         
            /// DataSet转换为泛型集合         
            /// </summary>         
            /// <typeparam name="T">泛型类型</typeparam>         
            /// <param name="ds">DataSet数据集</param>         
            /// <param name="tableName">待转换数据表名称,名称为空时默认第0张表</param>         
            /// <returns>返回泛型集合</returns>         
            public static IList<T> ToList<T>(this DataSet ds, string tableName)
            {
                int _TableIndex = 0;
                if (ds == null || ds.Tables.Count < 0)
                    return null;
                if (string.IsNullOrEmpty(tableName))
                    return ToList<T>(ds, 0);
                for (int i = 0; i < ds.Tables.Count; i++)
                {
                    // 获取Table名称在Tables集合中的索引值                 
                    if (ds.Tables[i].TableName.Equals(tableName))
                    {
                        _TableIndex = i;
                        break;
                    }
                }
                return ToList<T>(ds, _TableIndex);
            }
    #endregion
            #region 泛型集合转换为数据集扩展
            /// <summary>
            /// 将泛型集合转换成DataSet数据集
            /// </summary>
            /// <typeparam name="T">T类型</typeparam>
            /// <param name="list">泛型集合</param>
            /// <returns>DataSet数据集</returns>
            public static DataSet ToDataSet<T>(this IList<T> list)
            {
                Type elementType = typeof(T);
                var ds = new DataSet();
                var t = new DataTable();
                ds.Tables.Add(t);
                elementType.GetProperties().ToList().ForEach(propInfo => t.Columns.Add(propInfo.Name, Nullable.GetUnderlyingType(propInfo.PropertyType) ?? propInfo.PropertyType));
                foreach (T item in list)
                {
                    var row = t.NewRow();
                    elementType.GetProperties().ToList().ForEach(propInfo => row[propInfo.Name] = propInfo.GetValue(item, null) ?? DBNull.Value);
                    t.Rows.Add(row);
                }
                return ds;
            }
            /// <summary>
            /// 泛型集合转换成DataTable表
            /// </summary>
            /// <typeparam name="T">T类型</typeparam>
            /// <param name="list">泛型集合</param>
            /// <returns>DataTable表</returns>
            public static DataTable ToDataTable<T>(this IList<T> list)
            {
                return ToDataTable(list, null);
            }
            /// <summary>
            /// 泛型集合转换成DataTable表
            /// </summary>
            /// <typeparam name="T">T类型</typeparam>
            /// <param name="list">泛型集合</param>
            /// <param name="_tableName">Table名称</param>
            /// <returns>DataTable表</returns>
            public static DataTable ToDataTable<T>(this IList<T> list, string _tableName)
            {
                Type elementType = typeof(T);
                var dt = new DataTable();
                if (_tableName == "null")
                    dt.TableName = _tableName;
                elementType.GetProperties().ToList().ForEach(propInfo => dt.Columns.Add(propInfo.Name, Nullable.GetUnderlyingType(propInfo.PropertyType) ?? propInfo.PropertyType));
                foreach (T item in list)
                {
                    var row = dt.NewRow();
                    elementType.GetProperties().ToList().ForEach(propInfo => row[propInfo.Name] = propInfo.GetValue(item, null) ?? DBNull.Value);
                    dt.Rows.Add(row);
                }
                return dt;
            }
            #endregion
            #region 以下为IEnumerable扩展实现
            /// <summary>
            /// 给非强类型的IEnumerable返回头一个元素。
            /// </summary>
            public static object First(this IEnumerable col)
            {
                foreach (var item in col)
                    return item;
                throw new IndexOutOfRangeException();
            }
            /// <summary>
            /// 给非强类型的IEnumerable返回头一个强类型的元素
            /// </summary>
            public static object First<T>(this IEnumerable col)
            {
                return (T)col.First();
            }
            /// <summary>
            /// 基本上和List<T>的ForEach方法一致。
            /// </summary>
            public static void Each<T>(this IEnumerable<T> col, Action<T> handler)
            {
                foreach (var item in col)
                    handler(item);
            }
            /// <summary>
            /// 带索引的遍历方法。
            /// </summary>
            public static void Each<T>(this IEnumerable<T> col, Action<T, int> handler)
            {
                int index = 0;
                foreach (var item in col)
                    handler(item, index++);
            }
            /// <summary>
            /// 可以半途中断执行的遍历方法。
            /// </summary>
            public static void Each<T>(this IEnumerable<T> col, Func<T, bool> handler)
            {
                foreach (var item in col)
                    if (!handler(item)) break;
            }
            /// <summary>
            /// 可以半途中段的带索引的遍历方法。
            /// </summary>
            public static void Each<T>(this IEnumerable<T> col, Func<T, int, bool> handler)
            {
                int index = 0;
                foreach (var item in col)
                    if (!handler(item, index++)) break;
            }
            #endregion
            #region 以下为IEnumerable<T>的非泛型实现
            public static void Each<T>(this IEnumerable col, Action<object> handler)
            {
                foreach (var item in col)
                    handler(item);
            }
            public static void Each<T>(this IEnumerable col, Action<object, int> handler)
            {
                int index = 0;
                foreach (var item in col)
                    handler(item, index++);
            }
            public static void Each<T>(this IEnumerable col, Func<object, bool> handler)
            {
                foreach (var item in col)
                    if (!handler(item)) break;
            }
            public static void Each<T>(this IEnumerable col, Func<object, int, bool> handler)
            {
                int index = 0;
                foreach (var item in col)
                    if (!handler(item, index++)) break;
            }
            #endregion
        }
    }


  • 相关阅读:
    WampServer Mysql配置
    Java实现 蓝桥杯VIP 算法提高 陶陶摘苹果2
    Java实现 蓝桥杯VIP 算法提高 陶陶摘苹果2
    Java实现 蓝桥杯VIP 算法提高 陶陶摘苹果2
    Java实现 蓝桥杯VIP 算法提高 质因数2
    Java实现 蓝桥杯VIP 算法提高 质因数2
    Java实现 蓝桥杯VIP 算法提高 质因数2
    Java实现 蓝桥杯VIP 算法提高 质因数2
    Java实现 蓝桥杯VIP 算法提高 质因数2
    Java实现 蓝桥杯VIP 算法提高 前10名
  • 原文地址:https://www.cnblogs.com/aiwz/p/6153919.html
Copyright © 2011-2022 走看看