自用 .net C# List集合和DataTable互转,可自定义表头

Posted 你好创造者

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了自用 .net C# List集合和DataTable互转,可自定义表头相关的知识,希望对你有一定的参考价值。

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

namespace AddrList.Common

    public static class DataTable2ListHelper
    
        /// <summary>
        /// DataTable转List
        /// </summary>
        /// <typeparam name="T">列表项类型</typeparam>
        /// <param name="dt">要转换的内存表</param>
        /// <returns></returns>
        public static List<T> DatatTable2List<T>(this DataTable dt) where T : class, new()
        
            var list = new List<T>();
            var ps = typeof(T).GetProperties();

            //遍历所有DataTable的行
            foreach (DataRow dr in dt.Rows)
            
                var t = new T();
                //通过反射获取T类型的所有成员
                foreach (PropertyInfo pi in ps)
                
                    if (dt.Columns.Contains(pi.Name) && dr[pi.Name] != DBNull.Value)
                    
                        object value = Convert.ChangeType(dr[pi.Name], pi.PropertyType);
                        //给T类型字段赋值
                        pi.SetValue(t, value, null);
                    
                
                //将T类型添加到集合list
                list.Add(t);
            
            return list;
        

        /// <summary>
        /// List转换为DataTable
        /// </summary>
        /// <typeparam name="T">列表项类型</typeparam>
        /// <param name="list">要转换的集合</param>
        /// <returns></returns>
        public static DataTable List2DataTable<T>(this List<T> list) where T : class
        
            var dt = new DataTable();
            var ps = typeof(T).GetProperties();

            var columns = ps.Select(p => new DataColumn(p.Name, p.PropertyType)).ToArray();
            dt.Columns.AddRange(columns);

            foreach (T t in list)
            
                DataRow dr = dt.NewRow();
                foreach (PropertyInfo pi in ps)
                
                    if (dt.Columns.Contains(pi.Name) && pi.GetValue(t) != null)
                    
                        dr[pi.Name] = pi.GetValue(t);
                    
                
                dt.Rows.Add(dr);
            

            return dt;
        

        /// <summary>
        /// DataTable转List
        /// </summary>
        /// <typeparam name="T">列表项类型</typeparam>
        /// <param name="dt">要转换的内存表</param>
        /// <param name="header">表头</param>
        /// <returns></returns>
        public static List<T> DatatTable2List<T>(this DataTable dt, Dictionary<string, string> header) where T : class, new()
        
            if (!(header?.Any() ?? false)) return DatatTable2List<T>(dt);

            var list = new List<T>();
            var ps = typeof(T).GetProperties();

            foreach (DataColumn column in dt.Columns)
            
                if (header.Where(m => m.Value == column.ColumnName).Any())
                
                    column.ColumnName = header.Where(m => m.Value == column.ColumnName).FirstOrDefault().Key;
                
            

            //遍历所有DataTable的行
            foreach (DataRow dr in dt.Rows)
            
                var t = new T();
                //通过反射获取T类型的所有成员
                foreach (PropertyInfo pi in ps)
                
                    if (dt.Columns.Contains(pi.Name) && dr[pi.Name] != DBNull.Value)
                    
                        object value = Convert.ChangeType(dr[pi.Name], pi.PropertyType);
                        //给T类型字段赋值
                        pi.SetValue(t, value, null);
                    
                
                //将T类型添加到集合list
                list.Add(t);
            
            return list;
        

        /// <summary>
        /// List转换为DataTable
        /// </summary>
        /// <typeparam name="T">列表项类型</typeparam>
        /// <param name="list">要转换的集合</param>
        /// <param name="header">表头</param>
        /// <returns></returns>
        public static DataTable List2DataTable<T>(this List<T> list, Dictionary<string, string> header) where T : class
        
            if (!(header?.Any() ?? false)) return List2DataTable(list);

            var dt = new DataTable();
            var ps = typeof(T).GetProperties();

            dt.Columns.AddRange(
                header.
                Select(m => new DataColumn(m.Value, ps.Where(p => p.Name == m.Key).FirstOrDefault().PropertyType)).
                ToArray());

            foreach (T t in list)
            
                DataRow dr = dt.NewRow();
                foreach (PropertyInfo pi in ps)
                
                    if (header.ContainsKey(pi.Name) &&
                        dt.Columns.Contains(header[pi.Name]) &&
                        pi.GetValue(t) != null)
                    
                        dr[header[pi.Name]] = pi.GetValue(t);
                    
                
                dt.Rows.Add(dr);
            

            return dt;
        

        /// <summary>
        /// 更换内存表表头
        /// </summary>
        /// <param name="dt">内存表</param>
        /// <param name="header">表头</param>
        /// <returns></returns>
        public static DataTable ChangeHeader(this DataTable dt, Dictionary<string, string> header)
        
            var l = dt.Columns.Count;

            for (int i = 0; i < l; i++)
            
                DataColumn column = dt.Columns[i];
                if (header.ContainsKey(column.ColumnName))
                
                    column.ColumnName = header[column.ColumnName];
                
                else
                
                    dt.Columns.Remove(column);
                
            

            return dt;
        
    

  

转载C#使用ToList()将数组快速转换为List集合

在C#的编程中,数组和List集合是比较常用的两个集合类,有时候因为业务需要,需要将数组集合转换为List集合,此时就可以使用C#中的 Linq的扩展方法ToList方法来实现,只需要简单的一条语句即可将数组对象转换为List集合对象。ToList方法所在的命名空间为 System.Linq里面。

例如下面有个字符串类型string的数组集合strArr,需要将之转换为List<string>类型的字符串List集合,可使用下列语句:

string[] strArr = new string[3] { "1", "2", "3" };

List<string> strList = strArr.ToList();

以上是关于自用 .net C# List集合和DataTable互转,可自定义表头的主要内容,如果未能解决你的问题,请参考以下文章

自用 .net C# CSV文件写入读取工具类

list转换datatable

令人惊讶的性能差异:List.Contains、Sorted List.ContainsKey、DataRowCollection.Contains、Data Table.Select、DataTab

使用 PostgreSql 和 ADO.NET 在 C# WinForms 中锁定记录和表

想问下。C#中怎么把List集合转为DataSet。

c#中datagridview中datasource反复赋值没有变化?