在IT领域,尤其是在数据处理与应用开发中,`DataTable`和`List<T>`是两种非常常见的数据结构。`DataTable`源自.NET Framework中的`System.Data`命名空间,它模仿了关系数据库表格的结构,包括行(`DataRow`)和列(`DataColumn`),非常适合存储和操作具有表格形式的数据。另一方面,`List<T>`则来自`System.Collections.Generic`命名空间,它是一种动态数组,能够存储任意数量的同类型元素,并提供了丰富的集合操作。 ### `DataTable`与`List<T>`的相互转换 #### `DataTable`转`List<T>` 在.NET框架中,将`DataTable`转换为`List<T>`通常涉及遍历`DataTable`的每一行,然后创建`T`类型的实例,并将每一列的值映射到相应的属性上。这个过程可以通过反射来实现,但效率较低。然而,随着C# 3.0的引入,LINQ(Language Integrated Query)和自动属性(Auto-implemented properties)的出现,使得这一转换过程变得更加简洁高效。 在给定的部分内容中,通过扩展方法`ToList<TResult>`实现了`DataTable`到`List<TResult>`的转换。该方法首先收集所有`TResult`类型的公共属性信息,然后检查这些属性是否在`DataTable`中存在对应的列名。接着,对于`DataTable`中的每一行,它会创建一个`TResult`的实例,并使用反射将每列的值设置到相应属性上。将填充后的对象添加到`List<TResult>`中。 #### `List<T>`转`DataTable` 反之,将`List<T>`转换为`DataTable`的过程也相对直观。需要获取`T`类型的公共属性信息,然后基于这些属性创建`DataTable`的列。接下来,遍历`List<T>`中的每一个元素,使用反射获取其属性值,并将这些值添加到新的`DataRow`中。将这个`DataRow`添加到`DataTable`中。 在提供的代码片段中,通过扩展方法`ToDataTable<TResult>`实现了这一转换。该方法首先创建了一个`List<PropertyInfo>`来存储`TResult`的所有公共属性信息,以及一个空的`DataTable`。接着,它会遍历`TResult`的所有属性,并为每个属性在`DataTable`中添加一列。然后,它遍历`List<TResult>`中的每个元素,为每个元素创建一个新的`DataRow`,并将属性值填充进去,最后将这个`DataRow`添加到`DataTable`中。 ### 总结 `DataTable`与`List<T>`之间的转换是数据处理和应用程序开发中的常见需求。通过C# 3.0的特性,如扩展方法、自动属性和LINQ,可以以一种更为优雅和高效的方式实现这些转换。这些转换不仅简化了代码,提高了可读性和可维护性,同时也提升了程序的性能,尤其是在处理大量数据时。然而,需要注意的是,虽然这些转换方法提供了便利,但在实际应用中仍需考虑性能优化,特别是在高负载或大数据量场景下。例如,使用缓存机制或异步处理等策略,可以进一步提升数据处理的效率和响应速度。

















最近自从公司的开发环境改了. 从VS2003 改到VS2008 后 用了C# 3.0 的新东西 自己积累的方法就慢慢的多起来了.
由于经常使用以前经常DataTable 现在都使用ListT 就此需要经常转换.. 用的多了 自然需要写个简单的方法来实现互相转换
由于C#3.0出现了扩展方法 我们可以通过这样一个特性来简化我们的开发.
DataTable 转换为ListT 的我们可以通过扩展DataTable来简化
public static class DataTableExtensions
{
/// summary
/// DataTable 转换为List 集合
/// /summary
/// typeparam name=TResult类型/typeparam
/// param name=dtDataTable/param
/// returns/returns
public static ListTResult ToListTResult(this DataTable dt) where TResult : class,new()
{
//创建一个属性的列表
ListPropertyInfo prlist = new ListPropertyInfo();
//获取TResult的类型实例 反射的入口
Type t = typeof(TResult);
//获得TResult 的所有的Public 属性 并找出TResult属性和DataTable的列名称相同的属性(PropertyInfo) 并加入到属性列表
Array.ForEachPropertyInfo(t.GetProperties(), p = { if (dt.Columns.IndexOf(p.Name) != -1) prlist.Add(p); });
//创建返回的集合
ListTResult oblist = new ListTResult();
foreach (DataRow row in dt.Rows)

- 攻城必备2014-08-04值得学习,谢谢分享

- 粉丝: 6
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


最新资源
- 打破科技成果转化瓶颈,赋能产业园区升级.docx
- 高校成果转化新生态:构建价值网络的数智引擎.docx
- 高校科技成果转化困局与生态协同机制构建.docx
- 高校科技成果转化生态赋能新路径.docx
- 高校科技成果转化数智生态构建之道.docx
- 高校院所科技成果转化数智服务平台:构建生态价值网络.docx
- 高校院所科技成果转化数智服务平台:生态赋能创新转化.docx
- 高校院所科技成果转化数智服务平台:构建协同创新新生态.docx
- 高校院所科技成果转化数智服务平台:生态赋能型创新报告.docx
- 高校院所科技成果转化数智服务平台:生态赋能型营销软文.docx
- 高校院所科技成果转化数智服务平台赋能创新生态建设.docx
- 高校院所科技成果转化数智服务平台推动科技创新与产业发展深度融合.docx
- pytorch实现两个轻量级分割网络模型.zip
- 关于构建区域科技成果转化服务体系的建议.docx
- 构建高校院所科技成果转化新生态的数智化平台.docx
- 技术经纪人如何突破转化瓶颈.docx


