C#中DataTable和List互转的示例代码

下面我将详细讲解“C#中DataTable和List互转的示例代码”的完整攻略。

目录

  1. DataTable转List
    1.1 使用ToList扩展方法
    1.2 使用反射自动映射
  2. List转DataTable
    2.1 使用数据表生成方式
    2.2 使用反射自动映射

1. DataTable转List

1.1 使用ToList扩展方法

public static List<T> DataTableToList<T>(DataTable dataTable) where T : class, new()
{
    var list = new List<T>();
    foreach (DataRow row in dataTable.Rows)
    {
        var obj = new T();
        foreach (var property in typeof(T).GetProperties())
        {
            if (dataTable.Columns.Contains(property.Name))
                property.SetValue(obj, Convert.ChangeType(row[property.Name], property.PropertyType));
        }
        list.Add(obj);
    }
    return list;
}

上述代码中我们定义了一个静态方法DataRowToList,用于将DataTable转为List。其中T代表目标类型,这里使用泛型参数来实现通用性。

通过遍历DataRow,我们创建新对象T,并将DataRow的每个字段复制到对象T的属性中。为了确保映射的成功,代码中针对DataRow的每个字段均执行了相应的类型转换,包括空值判断、类型转换等。

使用方法:

var dataTable = new DataTable();
dataTable.Columns.Add("Name");
dataTable.Columns.Add("Age");
dataTable.Rows.Add("Tom", 18);
dataTable.Rows.Add("Jerry", 20);
var list = DataTableToList<Student>(dataTable);

上述代码中我们首先创建了一个包含两条记录的DataTable。接着调用我们刚刚定义的静态方法,将DataTable转为List。最终我们得到了一个包含两个学生实例的列表。

1.2 使用反射自动映射

public static List<T> DataTableToList<T>(DataTable dataTable) where T : new()
{
    var list = new List<T>();
    foreach (DataRow row in dataTable.Rows)
    {
        var obj = new T();
        foreach (PropertyInfo property in typeof(T).GetProperties())
        {
            if (!dataTable.Columns.Contains(property.Name)) continue;
            if (row[property.Name] != DBNull.Value)
                property.SetValue(obj, row[property.Name]);
        }
        list.Add(obj);
    }
    return list;
}

这段代码同样实现了DataTable转List的功能。不同的是,这里使用了反射技术,自动将DataRow的每个字段映射到目标对象的属性中。

这里省略了类型转换的过程,实践中需要根据具体情况添加相关代码逻辑。

使用方法:

var dataTable = new DataTable();
dataTable.Columns.Add("Name");
dataTable.Columns.Add("Age");
dataTable.Rows.Add("Tom", 18);
dataTable.Rows.Add("Jerry", 20);
var list = DataTableToList<Student>(dataTable);

同样是通过静态方法调用,我们实现了DataTable到List的迁移。

2. List转DataTable

2.1 使用数据表生成方式

public static DataTable ListToDataTable<T>(List<T> list)
{
    var dataTable = new DataTable();
    foreach (var property in typeof(T).GetProperties())
        dataTable.Columns.Add(property.Name, Nullable.GetUnderlyingType(property.PropertyType) ?? property.PropertyType);
    foreach (var item in list)
    {
        var dataRow = dataTable.NewRow();
        foreach (var property in typeof(T).GetProperties())
            dataRow[property.Name] = property.GetValue(item) ?? DBNull.Value;
        dataTable.Rows.Add(dataRow);
    }
    return dataTable;
}

上述代码中我们定义了一个静态方法ListToDataTable,用于将List转为DataTable。其中,泛型参数T表示转换的类型,使用了Nullable.GetUnderlyingType()方法来获取可为null的基础类型。

所有属性都被添加到数据表的列中,然后将属性值插入到数据行中。

使用方法:

var list = new List<Student>
{
    new Student { Name = "Tom", Age = 18 },
    new Student { Name = "Jerry", Age = 20 }
};
var dataTable = ListToDataTable(list);

上述代码中我们首先创建了一个包含两个学生实例的列表。接着调用我们的静态方法,将List转为DataTable。最终我们得到了一个包含两条记录的数据表。

2.2 使用反射自动映射

public static DataTable ListToDataTable<T>(List<T> list)
{
    var dataTable = new DataTable();
    if (list == null || !list.Any()) return dataTable;
    var properties = typeof(T).GetProperties();
    foreach (var property in properties)
    {
        dataTable.Columns.Add(property.Name, Nullable.GetUnderlyingType(property.PropertyType) ?? property.PropertyType);
    }
    foreach (var item in list)
    {
        var dataRow = dataTable.NewRow();
        foreach (var property in properties)
            dataRow[property.Name] = property.GetValue(item) ?? DBNull.Value;
        dataTable.Rows.Add(dataRow);
    }
    return dataTable;
}

这段代码使用了反射技术,通过获取泛型参数T的属性信息,自动将List的每个元素映射到数据表中。

同样的,我们省略了类型转换的过程,实践中需要根据具体情况添加相关代码逻辑。

使用方法:

var list = new List<Student>
{
    new Student { Name = "Tom", Age = 18 },
    new Student { Name = "Jerry", Age = 20 }
};
var dataTable = ListToDataTable(list);

同样是通过静态方法调用,我们实现了List到DataTable的迁移。

以上就是"C#中DataTable和List互转的示例代码"的完整攻略,其中介绍了具体实现的两种方式,包括了示例代码以及使用方法的详细介绍。希望可以对您有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C#中DataTable和List互转的示例代码 - Python技术站

(0)
上一篇 2023年5月31日
下一篇 2023年5月31日

相关文章

  • C#判断一天、一年已经过了百分之多少的方法

    C#判断一天、一年已经过了百分之多少的方法需要统计日期信息并进行运算,可以使用DateTime类和TimeSpan类来实现。下面将详细讲解实现方法。 使用DateTime类获取日期信息 通过使用DateTime.Now属性,可以获取当前系统时间,包含年月日、时分秒等信息。我们可以将这个信息保存到一个DateTime类型的变量中,并获取其中的年份、月份和天数来…

    C# 2023年6月1日
    00
  • c# 剔除sql语句’尾巴’的五种方法

    接下来我将为大家详细介绍“C#剔除SQL语句‘尾巴’的五种方法”: 一、问题描述 有时候在编写C#程序时,我们需要动态生成SQL语句。但是在动态生成SQL语句中,由于字符串拼接不当可能会导致语句的末尾出现多余的“AND”、“OR”等关键字,这就需要我们对字符串进行处理,去掉这些多余的关键字,以保证SQL语句的正确性。 下面将介绍五种方法来解决这个问题。 二、…

    C# 2023年5月15日
    00
  • LINQ基础之From和GroupBy子句

    下面给出详细的 “LINQ基础之From和GroupBy子句” 的攻略: From子句 from 子句用来指定数据源和创建一个范围变量,它负责查询和返回一个序列。 下面是一个示例,通过使用 from 子句从一个整数数组中选择所有大于 5 的数字: int[] numbers = { 2, 3, 5, 7, 11, 13 }; var result = fro…

    C# 2023年6月1日
    00
  • C#中把日志导出到txt文本的简单实例

    C#中把日志导出到txt文本的简单实例,可以分为以下几步: 1. 引入System.IO命名空间 首先,在程序的顶部引入System.IO命名空间,即: using System.IO; 2. 创建txt文件,并写入日志内容 接着,在程序中创建txt文件,并将日志内容写入该文件中。下面是一个示例: string logFilePath = @"D:…

    C# 2023年6月1日
    00
  • Entity Framework Core相关包的概念介绍与安装

    当我们使用.NET Core时,Entity Framework Core作为一种ORM(对象关系映射)框架,用于简化应用程序与关系型数据库之间的交互。 在使用Entity Framework Core之前,我们需要安装一些相关的软件包,本文将分为以下几个部分对Entity Framework Core相关包进行概念介绍与安装的攻略: Entity Fram…

    C# 2023年6月3日
    00
  • C#实现输入法功能详解

    C#实现输入法功能详解 输入法是一种计算机应用程序,它是用来帮助用户通过键盘输入字符、符号和单词的工具。在本文中,我们将会详细讲解如何使用C#实现输入法功能。 输入法基础知识 输入法主要包括两个方面,一个是输入法编辑器,它主要用于用户输入;另一个是输入法引擎,它主要用于将用户的输入转换成相应的文字。 输入法编辑器:输入法编辑器是一种输入控件,它类似于文本框,…

    C# 2023年6月1日
    00
  • 用.NET Core写爬虫爬取电影天堂

    用.NET Core写爬虫爬取电影天堂 在本攻略中,我们将详细介绍如何使用.NET Core编写爬虫程序,爬取电影天堂网站上的电影信息,并提供两个示例说明。 1. 安装依赖 在.NET Core应用程序中,需要安装以下依赖才能实现爬虫功能。可以按照以下步骤操作: 打开Visual Studio 2019。 打开“工具”菜单,选择“NuGet包管理器”-&gt…

    C# 2023年5月16日
    00
  • ASP.net(c#)用类的思想实现插入数据到ACCESS例子

    让我们来详细讲解一下如何用类的思想实现插入数据到 ACCESS 数据库。这里我们使用 ASP.NET (C#)编写代码。 1. 创建与数据库连接的类 在 ASP.NET 中,我们使用 System.Data.OleDb 命名空间来操作 ACCESS 数据库。首先,我们需要创建一个类来封装与数据连接相关的操作。 using System.Data.OleDb;…

    C# 2023年6月3日
    00
合作推广
合作推广
分享本页
返回顶部