.NET 帮助

C# Datatable 转 List(开发者如何使用)

发布 2023年十一月14日
分享:

在使用 C# 编程的过程中,经常需要将 "数据表 "转换为列表。虽然许多新手都会遇到这种情况,但得到的答案往往不够全面。本教程旨在弥合这一差距,并就如何在 C# 中将 DataTable 转换为 list 提供清晰的指导。

什么是 "数据表"?

在深入了解转换过程之前,了解什么是 数据表 是。在 C# 中,"DataTable "对象是一个内存数据库表的表示,其中包含行和列。它是 System.Data 命名空间的一部分。

在本教程中,我们使用一个名为 DataTable dt 的示例 DataTable 。数据表 dt` 的可视化代码示例如下:

DataTable dt = new DataTable();
dt.Columns.Add("ID", typeof(int));
dt.Columns.Add("Category", typeof(string));
dt.Rows.Add(1, "Electronics");
dt.Rows.Add(2, "Books");
DataTable dt = new DataTable();
dt.Columns.Add("ID", typeof(int));
dt.Columns.Add("Category", typeof(string));
dt.Rows.Add(1, "Electronics");
dt.Rows.Add(2, "Books");
Dim dt As New DataTable()
dt.Columns.Add("ID", GetType(Integer))
dt.Columns.Add("Category", GetType(String))
dt.Rows.Add(1, "Electronics")
dt.Rows.Add(2, "Books")
VB   C#

开始转换

你已经得到了 DataTable dt,现在你正盯着它想:"我该如何转换呢?别担心,这是一个显示研究努力的问题。将 DataTable 转换为列表主要有两种方法:

1.使用 LINQ (语言综合查询)

2.使用经典的 `foreach 循环

使用 LINQ 进行转换

LINQ 方法是 C# 中的一个强大工具,它提供了一种以声明方式查询集合的方法。让我们来看看如何做到这一点。

像下面的代码示例一样定义一个方法:

private static void LinqMethod(DataTable dt)
{
    var list = dt.AsEnumerable().Select(row =>
        new 
        {
            ID = row.Field<int>("ID"),
            Category = row.Field<string>("Category")
        }).ToList();
}
private static void LinqMethod(DataTable dt)
{
    var list = dt.AsEnumerable().Select(row =>
        new 
        {
            ID = row.Field<int>("ID"),
            Category = row.Field<string>("Category")
        }).ToList();
}
Private Shared Sub LinqMethod(ByVal dt As DataTable)
	Dim list = dt.AsEnumerable().Select(Function(row) New With {
		Key .ID = row.Field(Of Integer)("ID"),
		Key .Category = row.Field(Of String)("Category")
	}).ToList()
End Sub
VB   C#

请注意 var listvar rowlinqmethod 的使用。在上述代码中,扩展方法 AsEnumerable()会在DataTable dt上调用。这样,我们就可以在DataTable中的每一行DataRow` 上使用 LINQ。

使用 Foreach 循环进行转换

在 C# 中,"foreach 循环 "是迭代集合的一种久经考验的方法。这种方法可能看起来有点长,但很容易理解和实现。

让我们开始吧:

private static void ForeachMethod(DataTable dt)
{
    List<Category> list = new List<Category>();

    // Iterates through each row within the data table
    foreach (DataRow row in dt.Rows)
    {
        var category = new Category();
        category.ID = Convert.ToInt32(row ["ID"]);
        category.Name = row ["Category"].ToString();
        list.Add(category);
    }
}
private static void ForeachMethod(DataTable dt)
{
    List<Category> list = new List<Category>();

    // Iterates through each row within the data table
    foreach (DataRow row in dt.Rows)
    {
        var category = new Category();
        category.ID = Convert.ToInt32(row ["ID"]);
        category.Name = row ["Category"].ToString();
        list.Add(category);
    }
}
Private Shared Sub ForeachMethod(ByVal dt As DataTable)
	Dim list As New List(Of Category)()

	' Iterates through each row within the data table
	For Each row As DataRow In dt.Rows
		Dim category As New Category()
		category.ID = Convert.ToInt32(row ("ID"))
		category.Name = row ("Category").ToString()
		list.Add(category)
	Next row
End Sub
VB   C#

在 `private static void ForeachMethod()方法,使用 "foreach 循环 "遍历 "数据表"。对于每一条 "数据行",都会实例化一个新的 "var 类别 "对象,并将其添加到 "var 列表 "中。

要表示类别,您需要一个类:

public class Category
{
    public int ID { get; set; }
    public string Name { get; set; }
}
public class Category
{
    public int ID { get; set; }
    public string Name { get; set; }
}
Public Class Category
	Public Property ID() As Integer
	Public Property Name() As String
End Class
VB   C#

扩展高级转换技术

在掌握了用 C# 将 DataTable 转换为列表的基础知识后,还有一些高级技术和注意事项可以优化这一过程并使其适用于更复杂的情况。让我们深入探讨其中的一些技术。

前面讨论过的方法有一个局限性,那就是它们只针对我们的 Category 类。如果您能编写一种方法,将任何 DataTable 转换为通用对象列表,会怎样呢?

使用 Reflection 将 DataTable 转换为列表

反射是 C# 中的一个强大工具,它允许你在运行时检查类型的元数据。让我们利用它的强大功能

private static List<T> ConvertDataTableToList<T>(DataTable dt) where T : new()
{
    List<T> list = new List<T>();

    foreach (DataRow row in dt.Rows)
    {
        T obj = new T();
        foreach (DataColumn col in dt.Columns)
        {
            var prop = obj.GetType().GetProperty(col.ColumnName);
            if (prop != null && row [col] != DBNull.Value)
                prop.SetValue(obj, row [col]);
        }
        list.Add(obj);
    }
    return list;
}
private static List<T> ConvertDataTableToList<T>(DataTable dt) where T : new()
{
    List<T> list = new List<T>();

    foreach (DataRow row in dt.Rows)
    {
        T obj = new T();
        foreach (DataColumn col in dt.Columns)
        {
            var prop = obj.GetType().GetProperty(col.ColumnName);
            if (prop != null && row [col] != DBNull.Value)
                prop.SetValue(obj, row [col]);
        }
        list.Add(obj);
    }
    return list;
}
Private Shared Function ConvertDataTableToList(Of T As New)(ByVal dt As DataTable) As List(Of T)
	Dim list As New List(Of T)()

	For Each row As DataRow In dt.Rows
		Dim obj As New T()
		For Each col As DataColumn In dt.Columns
			Dim prop = obj.GetType().GetProperty(col.ColumnName)
			If prop IsNot Nothing AndAlso row (col) IsNot DBNull.Value Then
				prop.SetValue(obj, row (col))
			End If
		Next col
		list.Add(obj)
	Next row
	Return list
End Function
VB   C#

此 "私有静态 "方法使用反射,遍历 "数据表 dt "中的每一行 "数据行 "和每一列。对于每一列,它都会搜索匹配的属性 (var prop) 并设置其值。这种方法可实现高度的重用性,可将任何 DataTable 转换为一个泛型对象列表。

使用方法

要使用上述代码,只需调用指定类型的方法即可:

List<Category> categories = ConvertDataTableToList<Category>(dt);
List<Category> categories = ConvertDataTableToList<Category>(dt);
Dim categories As List(Of Category) = ConvertDataTableToList(Of Category)(dt)
VB   C#

有了这种方法,你就不再局限于将特定数据表转换为特定对象类型。取而代之的是一个多功能工具,可以处理各种数据情况。

性能考虑因素

虽然反射方法很强大,但值得注意的是,它可能会比较慢,尤其是在使用大型数据表时。衡量性能并权衡代码的可重用性和可维护性始终是至关重要的。

Iron Suite Toolkit for .NET Developers

虽然我们已经深入研究了在 C# 中将 DataTable 转换为列表的复杂性,但有时,依靠外部工具可以简化我们的开发过程,尤其是在涉及到更复杂的操作时。这就是 Iron Suite 开始发挥作用。

Iron Suite 是一套全面的工具,旨在让 .NET 开发人员的生活更轻松。从 PDF 操作和 Excel 操作到光学字符识别 (光学字符识别) 和条形码读取,Iron Suite 提供了无数的功能。让我们分解 Iron Suite 的各个组件,看看它们如何补充我们的 "DataTable "操作。

IronPDF:PDF 强国

C# DataTable to List(如何为开发人员工作) 图 1 - IronPDF for .NET:C# PDF 库

当涉及到用 C# 处理 PDF 时、 IronPDF 改变了游戏规则。试想一下,将您的 "数据表 "转换为列表,然后需要从中生成 PDF 报告。IronPDF 可以毫不费力地从 PDF 文档中创建、编辑和提取数据,从而简化了将数据表衍生信息转化为专业报告的过程。

IronPDF 的主要功能是 HTML 转 PDF 功能,确保保留布局和样式。它能从网页内容生成 PDF,适用于报告、发票和文档。你可以毫不费力地将 HTML 文件、URL 和 HTML 字符串转换为 PDF 文件。

using IronPdf;

class Program
{
    static void Main(string[] args)
    {
        var renderer = new ChromePdfRenderer();

        // 1. Convert HTML String to PDF
        var htmlContent = "<h1>Hello, IronPDF!</h1><p>This is a PDF from an HTML string.</p>";
        var pdfFromHtmlString = renderer.RenderHtmlAsPdf(htmlContent);
        pdfFromHtmlString.SaveAs("HTMLStringToPDF.pdf");

        // 2. Convert HTML File to PDF
        var htmlFilePath = "path_to_your_html_file.html"; // Specify the path to your HTML file
        var pdfFromHtmlFile = renderer.RenderHtmlFileAsPdf(htmlFilePath);
        pdfFromHtmlFile.SaveAs("HTMLFileToPDF.pdf");

        // 3. Convert URL to PDF
        var url = "http://ironpdf.com"; // Specify the URL
        var pdfFromUrl = renderer.RenderUrlAsPdf(url);
        pdfFromUrl.SaveAs("URLToPDF.pdf");
    }
}
using IronPdf;

class Program
{
    static void Main(string[] args)
    {
        var renderer = new ChromePdfRenderer();

        // 1. Convert HTML String to PDF
        var htmlContent = "<h1>Hello, IronPDF!</h1><p>This is a PDF from an HTML string.</p>";
        var pdfFromHtmlString = renderer.RenderHtmlAsPdf(htmlContent);
        pdfFromHtmlString.SaveAs("HTMLStringToPDF.pdf");

        // 2. Convert HTML File to PDF
        var htmlFilePath = "path_to_your_html_file.html"; // Specify the path to your HTML file
        var pdfFromHtmlFile = renderer.RenderHtmlFileAsPdf(htmlFilePath);
        pdfFromHtmlFile.SaveAs("HTMLFileToPDF.pdf");

        // 3. Convert URL to PDF
        var url = "http://ironpdf.com"; // Specify the URL
        var pdfFromUrl = renderer.RenderUrlAsPdf(url);
        pdfFromUrl.SaveAs("URLToPDF.pdf");
    }
}
Imports IronPdf

Friend Class Program
	Shared Sub Main(ByVal args() As String)
		Dim renderer = New ChromePdfRenderer()

		' 1. Convert HTML String to PDF
		Dim htmlContent = "<h1>Hello, IronPDF!</h1><p>This is a PDF from an HTML string.</p>"
		Dim pdfFromHtmlString = renderer.RenderHtmlAsPdf(htmlContent)
		pdfFromHtmlString.SaveAs("HTMLStringToPDF.pdf")

		' 2. Convert HTML File to PDF
		Dim htmlFilePath = "path_to_your_html_file.html" ' Specify the path to your HTML file
		Dim pdfFromHtmlFile = renderer.RenderHtmlFileAsPdf(htmlFilePath)
		pdfFromHtmlFile.SaveAs("HTMLFileToPDF.pdf")

		' 3. Convert URL to PDF
		Dim url = "http://ironpdf.com" ' Specify the URL
		Dim pdfFromUrl = renderer.RenderUrlAsPdf(url)
		pdfFromUrl.SaveAs("URLToPDF.pdf")
	End Sub
End Class
VB   C#

IronXL:卓越的 Excel 操作

C# DataTable to List(如何为开发人员工作) 图 2 - IronXL for .NET:C# Excel 库

如果您的 "DataTable "转换导致需要执行与 Excel 相关的任务、 IronXL 是一款值得信赖的工具。该产品可为读取、编辑和创建 Excel 电子表格提供无缝操作。有了数据表到列表的转换功能,使用 IronXL 将数据导出为 Excel 格式就变得无比简单。

IronOCR:识别文本

C# DataTable to List(如何为开发人员工作) 图 3 - IronOCR for .NET:C# OCR 库

有时,您的 DataTable 包含基于图像的数据,或者您需要从图像中提取文本。这时 IronOCR 闪亮登场。它允许 .NET 开发人员从图像中读取文本,如果您的 "DataTable "转换操作涉及包含文本信息的图像,那么它就是一个辅助工具。

IronBarcode:字里行间的解读

将 C# 数据表转换为列表 (如何为开发人员服务) 图 4 - IronBarcode for .NET:C# 条码库

最后 IronBarcode 是在您的应用程序中进行任何条码操作的首选工具。假设您的 "DataTable "或您将其转换成的列表包含了带有条形码的产品信息。在这种情况下,IronBarcode 提供了读取和生成条形码的有效机制,弥补了原始产品数据和可扫描条形码信息之间的差距。

结论

将 C# 数据表转换为列表 (如何为开发人员服务) 图 5 - Iron Suite:许可证信息

虽然手动操作和转换 "DataTable "的方法对任何 C# 开发人员来说都至关重要,但集成 Iron Suite 提供的强大工具可以成倍地提高您的工作效率和能力。值得注意的是,每个产品的许可证都从 $749 起,更吸引人的是,每个产品都提供了一个 免费试用.如果您正在考虑投资这些工具,现在有一个诱人的提议:您可以 获得整个铁套房 只需两个产品的价格。采用这样全面的解决方案,无疑可以提高.NET开发工作的质量和效率。

< 前一页
C#网络应用程序(开发人员如何使用)
下一步 >
C# 引用关键字(开发人员工作原理)

准备开始了吗? 版本: 2024.9 刚刚发布

免费NuGet下载 总下载量: 10,731,156 查看许可证 >