跳至页脚内容
.NET 帮助

C# 数据表转列表(开发者如何使用)

Converting DataTable to List in C#

在使用C#编程领域中,经常需要将DataTable转换为列表。许多初学者在面对这一任务时常常遇到的答案不够全面。 本教程旨在弥合这一差距,提供一个关于如何将DataTable转换为C#列表的清晰指南。

什么是DataTable

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

为本教程的目的,让我们使用一个名为DataTable。 这可以可视化为如下所示:

using System.Data;

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");
using System.Data;

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");
$vbLabelText   $csharpLabel

开始转换

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

  1. 使用LINQ(语言集成查询)
  2. 使用经典的foreach循环

使用LINQ进行转换

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

定义一个方法如下:

using System.Linq;
using System.Collections.Generic;

private static List<dynamic> LinqMethod(DataTable dt)
{
    return dt.AsEnumerable().Select(row =>
        new 
        {
            ID = row.Field<int>("ID"),
            Category = row.Field<string>("Category")
        }).ToList();
}
using System.Linq;
using System.Collections.Generic;

private static List<dynamic> LinqMethod(DataTable dt)
{
    return dt.AsEnumerable().Select(row =>
        new 
        {
            ID = row.Field<int>("ID"),
            Category = row.Field<string>("Category")
        }).ToList();
}
$vbLabelText   $csharpLabel

在上述代码中,扩展方法DataTable dt上。 这允许我们在DataRow上使用LINQ。 该方法创建了一个动态对象列表,每个对象代表DataTable中的一行。

使用foreach循环进行转换

foreach循环是一个经受考验的方法,用于遍历C#中的集合。 这种方法可能看起来稍微长一点,但容易理解和实现。

其工作原理如下:

private static List<Category> 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
        {
            ID = Convert.ToInt32(row["ID"]),
            Name = row["Category"].ToString()
        };
        list.Add(category);
    }
    return list;
}

public class Category
{
    public int ID { get; set; }
    public string Name { get; set; }
}
private static List<Category> 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
        {
            ID = Convert.ToInt32(row["ID"]),
            Name = row["Category"].ToString()
        };
        list.Add(category);
    }
    return list;
}

public class Category
{
    public int ID { get; set; }
    public string Name { get; set; }
}
$vbLabelText   $csharpLabel

list中。

扩展高级转换技术

掌握了在C#中将DataTable转换为列表的基础知识后,有几种高级技术和考虑可以优化此过程并将其适应更复杂的场景。 让我们深入研究这些技术。

使用反射将DataTable转换为列表

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

using System.Reflection;

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;
}
using System.Reflection;

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;
}
$vbLabelText   $csharpLabel

这种DataRow和列。 对于每个列,它会搜索通用对象中的匹配属性并设置其值。 这种方法允许创建一个高度可重用的方法,可以将任意DataTable转换为通用对象列表。

使用

要使用上述代码,只需通过指定类型调用方法:

List<Category> categories = ConvertDataTableToList<Category>(dt);
List<Category> categories = ConvertDataTableToList<Category>(dt);
$vbLabelText   $csharpLabel

使用此方法,您不再局限于将特定数据表转换为特定对象类型。相反,您手头有一个灵活的工具,可以处理多种数据场景。

性能考虑

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

为.NET开发人员提供的Iron Suite工具包

虽然我们深入研究了在C#中将DataTable转换为列表的复杂性,但有时依靠外部工具可以简化我们的开发过程,特别是在更复杂的操作中。 这就是Iron Suite的用武之地。

IronPDF:PDF强力工具

C# DataTable转列表(开发者如何工作的)图1 - IronPDF for .NET: The C# PDF Library

在C#中处理PDF时,IronPDF是一个改变游戏规则的工具。 想象一下,您已将DataTable转换为一个列表,然后需要从中生成一个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");
    }
}
$vbLabelText   $csharpLabel

IronXL:在Excel操作中表现出色

C# DataTable转列表(开发者如何工作的)图2 - IronXL for .NET: The C# Excel Library

如果您的DataTable转换后需要进行与Excel相关的任务,IronXL是可以求助的工具。 该产品提供无缝的操作,用于读取、编辑和创建Excel电子表格。 有了数据表到列表的转换,导出数据到Excel格式变得非常简单,只需使用IronXL即可。

IronOCR:使文本可辨认

C# DataTable转列表(开发者如何工作的)图3 - IronOCR for .NET: The C# OCR Library

有时候,您的DataTable可能包含基于图像的数据,或者您需要从图像中提取文本。 这就是IronOCR闪耀的地方。 这使得.NET开发人员可以从图像中读取文本,使其成为一个补充工具,如果您的DataTable转换操作涉及包含文本信息的图像。

IronBarcode:从条形码中读取信息

C# DataTable转列表(开发者如何工作的)图4 - IronBarcode for .NET: The C# Barcode Library

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

结论

C# DataTable转列表(开发者如何工作的)图5 - Iron Suite: License information

虽然手动操作和转换DataTable的方法对任何C#开发人员来说都是至关重要的,但集成Iron Suite提供的强大工具可以极大地提高生产力和能力。 值得注意的是,每个产品的许可证起始于$799,更有吸引力的是,每个产品都提供免费试用。 如果您考虑投资这些工具,有一个诱人的报价:您可以以两个产品的价格获得整个Iron Suite。 采用这样全面的解决方案,确实可以提升您的.NET开发工作质量和效率。

常见问题解答

C#中的DataTable是什么?

C#中的DataTable是数据库表的内存表示,由行和列组成。它是System.Data命名空间的一部分。

如何在C#中使用LINQ将DataTable转换为列表?

您可以通过使用AsEnumerable()方法迭代每个DataRow并使用Select方法创建表示每一行的动态对象列表来使用LINQ将DataTable转换为列表。

在C#中使用foreach循环转换DataTable为列表的过程是怎样的?

要使用foreach循环将DataTable转换为列表,需迭代每个DataRow,为每行实例化一个新对象,从DataRow中填充其属性,并将其添加到列表中。

反射如何增强C#中的DataTable转换?

通过使用反射,可以通过动态映射DataTable列到对象属性,实现一个高度可重用的方法,将任意DataTable转换为通用对象的列表。

IronPDF如何在处理从DataTable派生的PDF中提供帮助?

IronPDF使开发人员能够创建、编辑和从PDF文档中提取数据,这对于从DataTable派生的数据生成报告非常有用。

IronXL在C#中的Excel操作有什么优势?

IronXL促进了从DataTable到Excel格式的数据导出,使开发人员能够轻松高效地读取、编辑和创建Excel电子表格。

IronOCR可以在哪些方面应用于DataTable?

IronOCR可以从DataTable内的图像中读取文本,使开发人员能够处理包含文本信息的基于图像的数据。

IronBarcode如何通过条形码增强DataTable操作?

IronBarcode提供了读取和生成条形码的功能,对于包含条形码产品信息的DataTable或列表非常有益。

在使用反射进行DataTable转换时,应注意哪些性能考虑?

尽管反射提供了灵活性,但通常比其他方法慢,尤其是在处理大型数据表时,因此在性能、可重用性和可维护性之间找到平衡很重要。

Iron Software产品是否有许可和试用机会?

是的,文章提到Iron Suite产品提供许可和试用机会,让开发人员在购买前评估工具。

Jacob Mellor,Team Iron 的首席技术官
首席技术官

Jacob Mellor 是 Iron Software 的首席技术官,也是一位开创 C# PDF 技术的有远见的工程师。作为 Iron Software 核心代码库的原始开发者,他从公司成立之初就开始塑造公司的产品架构,与首席执行官 Cameron Rimington 一起将公司转变为一家拥有 50 多名员工的公司,为 NASA、特斯拉和全球政府机构提供服务。

Jacob 拥有曼彻斯特大学土木工程一级荣誉工程学士学位(BEng)(1998-2001 年)。他的旗舰产品 IronPDF 和 Iron Suite for .NET 库在全球的 NuGet 安装量已超过 3000 万次,其基础代码继续为全球使用的开发人员工具提供动力。Jacob 拥有 25 年的商业经验和 41 年的编码专业知识,他一直专注于推动企业级 C#、Java 和 Python PDF 技术的创新,同时指导下一代技术领导者。

Iron Support Team

We're online 24 hours, 5 days a week.
Chat
Email
Call Me