全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

C#怎么将DataTable转换为List C#数据表转泛型列表方法

C#中DataTable转List推荐反射通用法:属性名与列名不区分大小写匹配,自动处理基础类型及可空类型,跳过不匹配列和DBNull值;LINQ法简洁但需手动处理类型转换和DBNull。

在C#中,将 DataTable 转换为泛型 List 是常见需求,核心思路是:**通过反射获取目标类型 T 的属性,逐行读取 DataTable 的数据并映射赋值**。关键在于字段名与属性名的匹配、类型转换的安全处理,以及性能优化。

使用反射 + 泛型方法(推荐,通用性强)

这是最常用、可复用的方式,适合大多数自定义实体类:

  • 要求实体类属性名与 DataTable 列名(ColumnName)完全一致(不区分大小写更稳妥)
  • 自动处理基础类型(int、string、DateTime 等)和可空类型(int?、DateTime?)
  • 跳过不匹配的列或无法转换的值,避免运行时异常

示例代码:

public static List ToList(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小时内与您取得联系。