首页 > 其他分享 >DataTable转为List集合

DataTable转为List集合

时间:2023-07-13 11:56:16浏览次数:44  
标签:Name List new dt 转为 DataTable 属性

public class TabletoList
    {
        public static List<T> TableToListModel<T>(DataTable dt) where T : new()
        {
            // 定义集合    
            List<T> ts = new List<T>();
 
            // 获得此模型的类型   
            Type type = typeof(T);
            string tempName = "";
 
            foreach (DataRow dr in dt.Rows)
            {
                T t = new T();
                // 获得此模型的公共属性      
                PropertyInfo[] propertys = t.GetType().GetProperties();
                foreach (PropertyInfo pi in propertys)
                {
                    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;
        }
    }
第一种
public static class DataTableExtensions
    {
        /// <summary>  
        /// DataTable 转换为List 集合  
        /// </summary>  
        /// <typeparam name="TResult">类型</typeparam>  
        /// <param name="dt">DataTable</param>  
        /// <returns></returns>  
        public static List<T> ToList<T>(this DataTable dt) where T : class, new()
        {
            //创建一个属性的列表  
            List<PropertyInfo> prlist = new List<PropertyInfo>();
            //获取TResult的类型实例  反射的入口  
            string Name = string.Empty;
            Type t = typeof(T);

            //获得TResult 的所有的Public 属性 并找出TResult属性和DataTable的列名称相同的属性(PropertyInfo) 并加入到属性列表   
            Array.ForEach<PropertyInfo>(t.GetProperties(), p => { if (dt.Columns.IndexOf(p.Name) != -1) prlist.Add(p); });

            //创建返回的集合  

            List<T> oblist = new List<T>();

            foreach (DataRow row in dt.Rows)
            {
                //创建TResult的实例  
                T ob = new T();
                //找到对应的数据  并赋值  
                prlist.ForEach(p =>
                {
                    try
                    {
                        Name = p.Name;
                        if (row[p.Name] != DBNull.Value) p.SetValue(ob, row[p.Name], null);
                    }
                    catch (Exception)
                    {

                    }
                });
                //放入到返回的集合中.  
                oblist.Add(ob);
            }
            return oblist;

        }
    }
第二种

这两种都是用的反射 获取类里的属性 来进行转化的

相对来说第二种方法快一点

标签:Name,List,new,dt,转为,DataTable,属性
From: https://www.cnblogs.com/wangqixian/p/17550065.html

相关文章

  • 对目标元素进行监听 - addListener和IntersectionObserver
    在web的构建中,经常需要对元素进行监听,例如监听元素是否出现在可视范围内。我们可以通过addEventListener来监听滚动,计算元素距离顶部的位置对元素的变更来做出反应。但是长时间大量的触发事件反而对网页性能影响很大,使用节流的话其实也只是浅浅的优化一下性能。有没有其他思路可......
  • 字符串转list以及list调remove方法报错
    Stringstr=scanner.nextLine();String[]arr=str.split("");List<String>list=newArrayList<>(Arrays.asList(arr));注意:使用Array.aslList时转出来的list是没有add和remove方法的,所以我们调用就会报错,把它放到newArrayList里面就能解决这个......
  • golang的list数据结构demo
    packagemainimport"container/list"funcmain(){varmylistlist.List//放在尾部mylist.PushBack("go")mylist.PushBack("grpc")mylist.PushBack("mysql")//头部放数据mylist.PushFront("gi......
  • windows下rclone挂在alist
    相比RaiDrive,rclone开源、免费、无广告、无弹窗。在使用上,rclone可能比RaiDrive卡顿。原因是rclone启动参数没设置好。把rclone的启动命令换成下面这个,将使rclone流畅度提升数倍。.\rclonemountalist:M:--network-mode--header"Referer:"--multi-thread-streams8--bu......
  • todoList
    <scriptsetup>import{ref}from"vue";consttodo=ref("");consttodoList=ref([]);constaddTodo=()=>{ todoList.value.push({todoName:todo.value,status:false}); todo.value="";}constdeleteTodo=()......
  • CMakeLists编译静态库与动态库
    一、编写一个库编写一个计算整数和浮点数之和的库函数mymath,文件目录 mymath.h#ifndefMYMATH_H#defineMYMATH_H intadd(int,int);doubleadd(double,double); #endifmymath.cc#include"mymath.h" intadd(inta,intb){  returna+b;} doubleadd(doublea,d......
  • java List去重的代码
    一、HashSet去重我们知道 HashSet 天生具备“去重”的特性,那我们只需要将List集合转换成HashSet集合就可以了,实现代码如下:publicclassListDistinctExample{publicstaticvoidmain(String[]args){List<Integer>list=newArrayList<Integer>(){{......
  • ArrayList 源码阅读
    ArrayList源码阅读常用的有序集合,采用的是线性结构,和ArrayList形成对比的是LinkedList,线性表的优点在于遍历查询,链表优点在于修改。属性privatestaticfinallongserialVersionUID=8683452581122892189L;/***m默认大小*/privatestaticfinalintDEFAULT_CAPA......
  • LinkedList 源码阅读
    LinkedList源码阅读LinkedList是通过实现链表从而进行存储的,其有私有内部类Node,通过泛型,从而实现储存各种类型对象。privatestaticclassNode<E>{//该节点的数据Eitem;//链表下一级Node<E>next;//上一级Node<E>prev;//构......
  • django values 与values_list的区别
    values values()方法返回包含字典的QuerySet<QuerySet[{'comment_id':1},{'comment_id':2}]>values_listvalues_list()方法返回一个包含元组的QuerySet<QuerySet[(1,),(2,)]>如果您使用values_list()单个字段,则可以使用flat=True返回单个值的QuerySet而不是1个元......