C#中DataTable转List推荐反射通用法:属性名与列名不区分大小写匹配,自动处理基础类型及可空类型,跳过不匹配列和DBNull值;LINQ法简洁但需手动处理类型转换和DBNull。
在C#中,将 DataTable 转换为泛型 List 是常见需求,核心思路是:**通过反射获取目标类型 T 的属性,逐行读取 DataTable 的数据并映射赋值**。关键在于字段名与属性名的匹配、类型转换的安全处理,以及性能优化。
这是最常用、可复用的方式,适合大多数自定义实体类:
ColumnName)完全一致(不区分大小写更稳妥)示例代码:
public static ListToList (DataTable dt) where T : new() { var list = new List (); var properties = typeof(T).GetProperties().ToDictionary(p => p.Name, StringComparer.OrdinalIgnoreCase); foreach (DataRow row in dt.Rows) { var obj = new T(); foreach (var prop in properties.Values) { if (dt.Columns.Contains(prop.Name) && row[prop.Name] != DBNull.Value) { try { var value = Convert.ChangeType(row[prop.Name], prop.PropertyType); prop.SetValue(obj, value); } catch { /* 类型不兼容时跳过该字段 */ } } } list.Add(obj); } return list;}
调用方式:
var users = ToList( dataTable);
使用 LINQ + DataRowExtensions(.NET Framework 3.5+ / .NET Core 3.0+)
如果 DataTable 结构固定、实体简单,可用更简洁的 LINQ 写法:
- 依赖
System.Data.DataSetExtensions(需引用对应 NuGet 包或框架内置)- 适合快速原型或单次转换,可读性高
- 需手动处理类型转换和 DBNull,灵活性略低
示例:
var list = dataTable.AsEnumerable() .Select(row => new User { Id = row.Field("Id"), Name = row.Field ("Name"), BirthDate = row.Field ("BirthDate") }).ToList(); 注意字段映射与类型安全
实际使用中容易出错的点:
- 列名大小写敏感:DataTable 列名默认区分大小写,建议用
StringComparer.OrdinalIgnoreCase或统一转小写比对- DBNull 处理:必须检查
row[colName] != DBNull.Value,否则Convert.ChangeType会抛异常- 可空类型支持:如
int?,要确保源值为 null 或能转为目标基础类型,Field方法内部已处理() - 日期/时间格式:数据库中可能存字符串,需提前清洗或自定义转换逻辑
性能优化小提示
大数据量时可提升效率:
- 预先缓存
PropertyInfo[]和列索引(如dt.Columns.IndexOf("Name")),避免每次循环重复查找- 用
foreach (DataRow row in dt.Rows)比for (int i = 0; i 更高效(DataTable 内部做了优化)- 若确定无 DBNull 且类型严格匹配,可省略 try-catch,但务必确保数据质量
基本上就这些。选反射通用版还是 LINQ 简洁版,取决于你的项目规范、数据稳定性和维护成本。不复杂但容易忽略细节,尤其在跨数据库或历史数据迁移场景下。
# 大数据 # ai # c# # .net # String # NULL # count # for # foreach # try # catch # 字符串 # int # 循环 # 空类型 # 泛型 # var # 类型转换 # 数据库 # linq # 性能优化 # 跳过 # 自定义 # 不匹配 # 这是 # 实体类 # 一转 # 转换为 # 数据库中 # 关键在于 # 最常用
相关文章: Swift中循环语句中的转移语句 break 和 continue 西安市网站制作公司,哪个相亲网站比较好?西安比较好的相亲网站? 如何通过商城免费建站系统源码自定义网站主题? 专业公司网站制作公司,用什么语言做企业网站比较好? 制作网站怎么制作,*游戏网站怎么搭建? 子杰智能建站系统|零代码开发与AI生成SEO优化指南 设计网站制作公司有哪些,制作网页教程? 一键网站制作软件,义乌购一件代发流程? 如何在阿里云通过域名搭建网站? 如何快速上传自定义模板至建站之星? 建站org新手必看:2024最新搭建流程与模板选择技巧 历史网站制作软件,华为如何找回被删除的网站? 宝塔建站后网页无法访问如何解决? b2c电商网站制作流程,b2c水平综合的电商平台? css网站制作参考文献有哪些,易聊怎么注册? php条件判断怎么写_ifelse和switchcase的使用区别【对比】 做企业网站制作流程,企业网站制作基本流程有哪些? 制作网站的软件免费下载,免费制作app哪个平台好? 如何自定义建站之星网站的导航菜单样式? 如何获取开源自助建站系统免费下载链接? 如何选择适合PHP云建站的开源框架? 如何在阿里云服务器自主搭建网站? 长春网站建设制作公司,长春的网络公司怎么样主要是能做网站的? 如何在IIS中新建站点并解决端口绑定冲突? 建站之星价格显示格式升级,你的预算足够吗? 如何快速查询网站的真实建站时间? 建站主机服务器选型指南与性能优化方案解析 如何用低价快速搭建高质量网站? 如何通过商城自助建站源码实现零基础高效建站? 黑客入侵网站服务器的常见手法有哪些? 如何在IIS7上新建站点并设置安全权限? 家族网站制作贴纸教程视频,用豆子做粘帖画怎么制作? 深圳防火门网站制作公司,深圳中天明防火门怎么编码? 广平建站公司哪家专业可靠?如何选择? 大连网站设计制作招聘信息,大连投诉网站有哪些? 已有域名如何快速搭建专属网站? 如何在建站宝盒中设置产品搜索功能? 常州自助建站工具推荐:低成本搭建与模板选择技巧 c# Task.ConfigureAwait(true) 在什么场景下是必须的 ,石家庄四十八中学官网? 自助网站制作软件,个人如何自助建网站? 西安制作网站公司有哪些,西安货运司机用的最多的app或者网站是什么? 如何用手机制作网站和网页,手机移动端的网站能制作成中英双语的吗? 建站之星ASP如何实现CMS高效搭建与安全管理? 建站主机无法访问?如何排查域名与服务器问题 详解一款开源免费的.NET文档操作组件DocX(.NET组件介绍之一) 广州美橙建站如何快速搭建多端合一网站? 如何高效完成自助建站业务培训? 制作充值网站的软件,做人力招聘为什么要自己交端口钱? 如何在Tomcat中配置并部署网站项目?
*请认真填写需求信息,我们会在24小时内与您取得联系。