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

前言

通常在DAL层我们都需要把DataTable转换为List<T>让调用者尽可能的好用,尽量的不用关心数据库的字段等,所以我们一般传过去的都是List<T>而不是DataTable。

泛型的好处: 它为使用c#语言编写面向对象程序增加了极大的效力和灵活性。不会强行对值类型进行装箱和拆箱,或对引用类型进行。当涉及到两者之间的转换时,就显得有些较为繁琐。这个其中的问题主要在两者的存储方式,DataTable的存储方式采用一种二维表的方式进行数据的存储操作,DataTable表示内存中数据的一个表。在List集合中,List的本质就是一个数组,则采用一种线性结构对数据进行存储。

在转换过程中,主要的问题在于不同类型的处理上,主要分为值类型和引用类型两大类。

C#中值类型总是含有相应该类型的一个值,指类型包含:简单类型(Simple types ),结构类型(struct types),枚举类型(Enumeration types)。

  • 简单类型包含:整型,布尔型,字符型 (整型的一种特殊情况),浮点型,小数型。
  • 整型包含: sbyte byteshortushortintuintlongulong char
  • 引用类型:引用类型不存储它们所代表的实际数据,但它们存储实际数据的引用。主要包含:对象类型,类类 型,接口,代表元,字符串类型,数组。

现提供转换的代码,仅供参考:

1.类型枚举:

 /// <summary>
 /// 类型枚举
 /// </summary>
 private enum ModelType
 {
 //值类型
 Struct,
 Enum,
 //引用类型
 String,
 Object,
 Else
 }

 private static ModelType GetModelType(Type modelType)
 {
 //值类型
 if (modelType.IsEnum)
 {
 return ModelType.Enum;
 }
 //值类型
 if (modelType.IsValueType)
 {
 return ModelType.Struct;
 }
 //引用类型 特殊类型处理
 if (modelType == typeof(string))
 {
 return ModelType.String;
 }
 //引用类型 特殊类型处理
 return modelType == typeof(object) ? ModelType.Object : ModelType.Else;
 }

2.具体的转换操作方法:

 /// <summary>
 /// datatable转换为List<T>集合
 /// </summary>
 /// <typeparam name="T"></typeparam>
 /// <param name="table"></param>
 /// <returns></returns>
 public static List<T> DataTableToList<T>(DataTable table)
 {
 var list = new List<T>();
 foreach (DataRow item in table.Rows)
 {
 list.Add(DataRowToModel<T>(item));
 }
 return list;
 }

 public static T DataRowToModel<T>(DataRow row)
 {
 T model;
 var type = typeof(T);
 var modelType = GetModelType(type);
 switch (modelType)
 {
 //值类型
 case ModelType.Struct:
 {
 model = default(T);
 if (row[0] != null)
 model = (T)row[0];
 }
 break;
 //值类型
 case ModelType.Enum:
 {
 model = default(T);
 if (row[0] != null)
 {
 var fiType = row[0].GetType();
 if (fiType == typeof(int))
 {
 model = (T)row[0];
 }
 else if (fiType == typeof(string))
 {
 model = (T)Enum.Parse(typeof(T), row[0].ToString());
 }
 }
 }
 break;
 //引用类型 c#对string也当做值类型处理
 case ModelType.String:
 {
 model = default(T);
 if (row[0] != null)
 model = (T)row[0];
 }
 break;
 //引用类型 直接返回第一行第一列的值
 case ModelType.Object:
 {
 model = default(T);
 if (row[0] != null)
 model = (T)row[0];
 }
 break;
 //引用类型
 case ModelType.Else:
 {
 //引用类型 必须对泛型实例化
 model = Activator.CreateInstance<T>();
 //获取model中的属性
 var modelPropertyInfos = type.GetProperties();
 //遍历model每一个属性并赋值DataRow对应的列
 foreach (var pi in modelPropertyInfos)
 {
 //获取属性名称
 var name = pi.Name;
 if (!row.Table.Columns.Contains(name) || row[name] == null) continue;
 var piType = GetModelType(pi.PropertyType);
 switch (piType)
 {
 case ModelType.Struct:
  {
  var value = Convert.ChangeType(row[name], pi.PropertyType);
  pi.SetValue(model, value, null);
  }
  break;
 case ModelType.Enum:
  {
  var fiType = row[0].GetType();
  if (fiType == typeof(int))
  {
  pi.SetValue(model, row[name], null);
  }
  else if (fiType == typeof(string))
  {
  var value = (T)Enum.Parse(typeof(T), row[name].ToString());
  if (value != null)
  pi.SetValue(model, value, null);
  }
  }
  break;
 case ModelType.String:
  {
  var value = Convert.ChangeType(row[name], pi.PropertyType);
  pi.SetValue(model, value, null);
  }
  break;
 case ModelType.Object:
  {
  pi.SetValue(model, row[name], null);
  }
  break;
 case ModelType.Else:
  throw new Exception("不支持该类型转换");
 default:
  throw new Exception("未知类型");
 }
 }
 }
 break;
 default:
 model = default(T);
 break;
 }
 return model;
 }

总结

以上的操作中,对不同类型有对应的处理方式。好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索c
, list
, datatable
, to
, datatable转化为list
转list
c站、c语言、cf、ch、c罗,以便于您获取更多的相关知识。

时间: 2024-10-01 08:05:51

C#中将DataTable转化成List&lt;T&gt;的方法解析_C#教程的相关文章

将Datatable转化成json发送前台实现思路_javascript技巧

1.将dt序列化成json,放到前台的隐藏控件[hidBoundary]中: 复制代码 代码如下: string json = JsonConvert.SerializeObject(dtTemp); this.hidBoundary.Value = json; 需要引用Newtonsoft.Json.dll 2.从前台隐藏空间中取得dt中的数据 复制代码 代码如下: var boundaryDiv = $('#hidBoundary'); if (boundaryDiv != undefine

C#中将DataTable转换成CSV文件的方法_C#教程

DataTable用于在.net项目中,用于缓存数据,DataTable表示内存中数据的一个表.CSV文件最早用在简单的数据库里,由于其格式简单,并具备很强的开放性,所以起初被扫图家用作自己图集的标记.CSV文件是个纯文本文件,每一行表示一张图片的许多属性. 在.net项目中运用C#将DataTable转化为CSV文件,现在提供一个较为通用的方法,具体代码如下: /// <summary> /// 将DataTable转换成CSV文件 /// </summary> /// <

DataTable 更改在有数据列的类型方法

原文:DataTable 更改在有数据列的类型方法 /// <summary> /// 修改数据表DataTable某一列的类型和记录值(正确步骤:1.克隆表结构,2.修改列类型,3.修改记录值,4.返回希望的结果) /// </summary> /// <param name="argDataTable">数据表DataTable</param> /// <returns>数据表DataTable</returns&g

word中将奇数行和偶数行合并成一行的方法技巧

  方法1 1.在Word中将文本转换为含两列的表格.全选后依次点:表格-转换-文本转换成表格(X). 2.将表格复制到Excel,在空白列填充"奇偶"文字.在第一二行空白列分别填上奇偶,选中这两个单元格,光标移到第二个单元格右下角时变为+,按住鼠标左键往下拖动,完成填充. 3.复制粘贴表格回到Word,将表格转换为文字.全选后依次点:表格-转换-表格转换成文本(B). 4.将"奇和回车符"一起全部替换为空白,再将"偶"全部替换为空白.依次点:编

C# DataTable中Compute方法用法集锦(数值/字符串/运算符/表等操作)_C#教程

本文实例讲述了C# DataTable中Compute方法用法.分享给大家供大家参考,具体如下: Compute函数的参数就两个:Expression,和Filter. Expresstion是计算表达式,关于Expression的详细内容请看这里: http://msdn2.microsoft.com/zh-cn/library/system.data.datacolumn.expression(VS.80).aspx 而Filter则是条件过滤器,类似sql的Where条件. DataTab

C# datatable 不能通过已删除的行访问该行的信息处理方法_C#教程

原因如下: Delete()之后需要datatable.AccepteChanges()方法确认完全删除,因为Delete()只是将相应列的状态标志为删除, 还可以通过datatable.RejectChanges()回滚,使该行取消删除. 如果要彻底删除datarow,需要Delete()和AccepteChanges()方法同时使用,或者采用datatable.Rows.RemoveAt(i)方法直接删除, 其中i表示行索引,还有一个就是datatable.Rows.Remove(DataR

C#序列化成XML注意细节_C#教程

最常用的序列化是把某个类序列化成二进制文件.但有时我们也会把类序列化成xml文件. 假如有如下一个类 复制代码 代码如下: class Arwen { private Hashtable table = new Hashtable(); private TimeSpan time = new TimeSpan(0, 0, 1); public Hashtable Table { get { return table; } set { table = value; } } public TimeS

C#如何将DataTable导出到Excel解决方案_C#教程

最近,由于公司项目中需要将系统内用户操作的所有日志进行转存备份,考虑到以后可能还需要还原,所以最后决定将日志数据备份到Excel中. 下面是我项目当中Excel.cs这个类的全部代码,通过这个类可以很容易地将DataTable中的数据导入到Excel方法中. 首先,必须要下载NPOI.dll这个程序集, 类代码如下: 复制代码 代码如下: using System; using NPOI.HSSF; using NPOI.HPSF; using NPOI.HSSF.UserModel; usin

c# 如何将RadioButton与DataTable数据进行绑定_C#教程

Control类有一个公共的属性是DataBindings,它可以将控件的属性与其他的数据绑定在一起.我接触到的有将两个控件的数据绑定.将控件的属性与DataTable绑定.以下说说在将DataTable与RadioButton绑定的过程中出现的问题. 界面上有两个RadioButton,rdoA和rdoB,以及一个显示dt数据的Button:后台定义一个私有变量DataTable dt.界面初始化完成后,将rdo与dt的值绑定起来. 复制代码 代码如下: DataTable dt = null