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

本文实例讲述了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#程序设计有所帮助。

(0)

相关推荐

  • C#中把Datatable转换为Json的5个代码实例

    实例一: 复制代码 代码如下: /// <summary>         /// Datatable转换为Json         /// </summary>        /// <param name="table">Datatable对象</param>         /// <returns>Json字符串</returns>         public static string ToJson(D

  • C#将DataTable转换成list的方法

    本文实例讲述了C#将DataTable转换成list及数据分页的方法.分享给大家供大家参考.具体如下: 复制代码 代码如下: /// <summary>   /// 酒店评论列表-分页  /// </summary>  /// <param name="userId"></param>  /// <param name="pageIndex">当前页</param>  /// <param

  • C#将DataTable转化为List<T>

    在使用三层架构开发一个网站时,希望把DataTable对象转换为List<T>对象,于是在网上找资料,总结一个比较方便的方法来实现--使用反射. 思路: 初始化一个List<T>对象 获取到T所有的属性,初始化一个T对象 遍历所有属性,如果DataTable中含有相应属性的值则为T对象赋值,如果没有对应的列则检查数据模型是否定义有误(属性名与列名比较时不区分大小写) 将T对象添加到List<T>对象中 总体代码: 反射获取到的属性信息 DataTable中的列信息,对比

  • C#实现DataTable,List和Json转换的方法

    本文实例讲述了C#实现DataTable,List和Json转换的方法.分享给大家供大家参考,具体如下: 1. 将DataTable或Ilist<>转换成JSON格式 using System; using System.Data; using System.Text; using System.Collections.Generic; using System.Reflection; /// <summary> /// 将DataTable或Ilist<>转换成JSO

  • C#对DataTable里数据排序的方法

    直接给个实例代码吧 复制代码 代码如下: protected void Page_Load(object sender, EventArgs e)    {        DataTable dt = new DataTable();        dt.Columns.Add("Name");        dt.Columns.Add("Age");//因为是字符串,所以排序不对        dt.Rows.Add("小明", "

  • C#中DataTable排序、检索、合并等操作实例

    一.排序1.获取DataTable的默认视图2.对视图设置排序表达式3.用排序后的视图导出的新DataTable替换就DataTable(Asc升序可省略,多列排序用","隔开)1).重生法 复制代码 代码如下: dstaset.Tables.Add(dt)dataset.Tables(0).DefaultView.Sort = "id desc" 2).直接法 复制代码 代码如下: dv = New DataView(dt)dv.Sort = "id d

  • c#的datatable转list示例

    复制代码 代码如下: using System;using System.Collections.Generic;using System.Data;using System.Reflection; namespace jdrz.HumanIdentify{    public class Helper    {        /// <summary>        /// DataTable 转换为List 集合        /// </summary>        ///

  • C#使用DataSet Datatable更新数据库的三种实现方法

    本文以实例形式讲述了使用DataSet Datatable更新数据库的三种实现方法,包括CommandBuilder 方法.DataAdapter 更新数据源以及使用sql语句更新.分享给大家供大家参考之用.具体方法如下: 一.自动生成命令的条件 CommandBuilder 方法 a)动态指定 SelectCommand 属性 b)利用 CommandBuilder 对象自动生成 DataAdapter 的 DeleteCommand.InsertCommand 和 UpdateCommand

  • c#将list类型转换成DataTable方法示例

    复制代码 代码如下: /// <summary>       /// 将List转换成DataTable       /// </summary>       /// <typeparam name="T"></typeparam>       /// <param name="data"></param>       /// <returns></returns>   

  • C#中将DataTable转化成List<T>的方法解析

    前言 通常在DAL层我们都需要把DataTable转换为List<T>让调用者尽可能的好用,尽量的不用关心数据库的字段等,所以我们一般传过去的都是List<T>而不是DataTable. 泛型的好处: 它为使用c#语言编写面向对象程序增加了极大的效力和灵活性.不会强行对值类型进行装箱和拆箱,或对引用类型进行.当涉及到两者之间的转换时,就显得有些较为繁琐.这个其中的问题主要在两者的存储方式,DataTable的存储方式采用一种二维表的方式进行数据的存储操作,DataTable表示内存

随机推荐