欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

C#实现DataTable转换成IList的方法

程序员文章站 2022-05-14 17:45:32
本文实例讲述了c#实现datatable转换成ilist的方法。分享给大家供大家参考,具体如下: 在用c#作开发的时候经常要把datatable转换成ilist;操作da...

本文实例讲述了c#实现datatable转换成ilist的方法。分享给大家供大家参考,具体如下:

在用c#作开发的时候经常要把datatable转换成ilist;操作datatable比较麻烦,把datatable转换成ilist,以对象实体作为ilist的元素,操作起来就非常方便。

注意:实体的属性必须和数据库中的字段必须一一对应,或者数据库字段名.tolower().contains(实体属性名.tolower())

数据类型暂时至支持int、string、datetime、float、double

using system;
using system.collections;
using system.collections.generic;
using system.data;
using system.reflection;
namespace tbtolisttest
{
  public class tbtolist<t> where t : new()
  {
    /// <summary>
    /// 获取列名集合
    /// </summary>
    private ilist<string> getcolumnnames(datacolumncollection dcc)
    {
      ilist<string> list = new list<string>();
      foreach (datacolumn dc in dcc)
      {
        list.add(dc.columnname);
      }
      return list;
    }
    /// <summary>
    ///属性名称和类型名的键值对集合
    /// </summary>
    private hashtable getcolumntype(datacolumncollection dcc)
    {
      if (dcc == null || dcc.count == 0)
      {
        return null;
      }
      ilist<string> colnamelist = getcolumnnames(dcc);
      type t = typeof(t);
      propertyinfo[] properties = t.getproperties();
      hashtable hashtable = new hashtable();
      int i = 0;
      foreach (propertyinfo p in properties)
      {
        foreach (string col in colnamelist)
        {
          if (col.tolower().contains(p.name.tolower()))
          {
            hashtable.add(col, p.propertytype.tostring() + i++);
          }
        }
      }
      return hashtable;
    }
    /// <summary>
    /// datatable转换成ilist
    /// </summary>
    /// <param name="dt"></param>
    /// <returns></returns>
    public ilist<t> tolist(datatable dt)
    {
      if (dt == null || dt.rows.count == 0)
      {
        return null;
      }
      propertyinfo[] properties = typeof(t).getproperties();//获取实体类型的属性集合
      hashtable hh = getcolumntype(dt.columns);//属性名称和类型名的键值对集合
      ilist<string> colnames = getcolumnnames(hh);//按照属性顺序的列名集合
      list<t> list = new list<t>();
      t model = default(t);
      foreach (datarow dr in dt.rows)
      {
        model = new t();//创建实体
        int i = 0;
        foreach (propertyinfo p in properties)
        {
          if (p.propertytype == typeof(string))
          {
            p.setvalue(model, dr[colnames[i++]], null);
          }
          else if (p.propertytype == typeof(int))
          {
            p.setvalue(model, int.parse(dr[colnames[i++]].tostring()), null);
          }
          else if (p.propertytype == typeof(datetime))
          {
            p.setvalue(model, datetime.parse(dr[colnames[i++]].tostring()), null);
          }
          else if (p.propertytype == typeof(float))
          {
            p.setvalue(model, float.parse(dr[colnames[i++]].tostring()), null);
          }
          else if (p.propertytype == typeof(double))
          {
            p.setvalue(model, double.parse(dr[colnames[i++]].tostring()), null);
          }
        }
        list.add(model);
      }
      return list;
    }
    /// <summary>
    /// 按照属性顺序的列名集合
    /// </summary>
    private ilist<string> getcolumnnames(hashtable hh)
    {
      propertyinfo[] properties = typeof(t).getproperties();//获取实体类型的属性集合
      ilist<string> ilist = new list<string>();
      int i = 0;
      foreach (propertyinfo p in properties)
      {
        ilist.add(getkey(p.propertytype.tostring() + i++, hh));
      }
      return ilist;
    }
    /// <summary>
    /// 根据value查找key
    /// </summary>
    private string getkey(string val, hashtable tb)
    {
      foreach (dictionaryentry de in tb)
      {
        if (de.value.tostring() == val)
        {
          return de.key.tostring();
        }
      }
      return null;
    }
  }
}

namespace tbtolisttest
{
  //实体
  public class person
  {
    public int id
    {
      set;
      get;
    }
    public string name
    {
      set;
      get;
    }
    public string age
    {
      set;
      get;
    }
    public string lover
    {
      set;
      get;
    }
  }
}

using system;
using system.data;
namespace tbtolisttest
{
  class program
  {
    static void main(string[] args)
    {
      tbtolist<person> tol = new tbtolist<person>();
      console.writeline();
      datatable dt = gettable();
      tol.tolist(dt);
      console.read();
    }
    public static datatable gettable()
    {
      datatable dt = new datatable();
      dt.columns.add("id");
      dt.columns.add("age");
      dt.columns.add("lover");
      dt.columns.add("name");
      datarow dr = dt.newrow();
      dr["id"] = 1;
      dr["age"] = "age1";
      dr["lover"] = "lover1";
      dr["name"] = "name1";
      dt.rows.add(dr);
      datarow dr1 = dt.newrow();
      dr1["id"] = 2;
      dr1["age"] = "age2";
      dr1["lover"] = "lover2";
      dr1["name"] = "name2";
      dt.rows.add(dr1);
      return dt;
    }
  }
}

更多关于c#相关内容感兴趣的读者可查看本站专题:《c#数据结构与算法教程》、《c#常见控件用法教程》、《c#面向对象程序设计入门教程》及《c#程序设计之线程使用技巧总结

希望本文所述对大家c#程序设计有所帮助。