.NET 帮助

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

在使用 C# 编程的领域中,经常需要将DataTable转换为列表。虽然许多初学者在这项任务上遇到了困难,但他们往往得到的答案还不够全面。 本教程旨在弥合这一差距,并提供一个关于如何在 C# 中将 DataTable 转换为列表的清晰指南。

什么是DataTable

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

为了本教程的目的,让我们使用一个名为DataTable dt的样本DataTableDataTable 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")
$vbLabelText   $csharpLabel

开始进行转换

所以,你有了你的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
$vbLabelText   $csharpLabel

注意使用var listvar rowlinqmethod。 在上述代码中,扩展方法AsEnumerable()被调用在DataTable dt上。 这使我们能够在DataTable中的每个DataRow row上使用LINQ。

使用Foreach循环进行转换

foreach 循环 是在 C# 中遍历集合的经过验证的方法。 这种方法可能看起来稍微长一点,但它易于理解和实施。

让我们开始:

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

private static void ForeachMethod()方法中,DataTable使用foreach 循环进行迭代。 对于每个datarow row,会实例化一个新的var category对象并将其添加到var list中。

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

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

扩展高级转换技术

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

之前讨论的方法的其中一个限制是它们仅适用于我们的Category类。 如果您可以编写一个方法,将任何DataTable转换为通用对象列表怎么办?

使用反射将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
$vbLabelText   $csharpLabel

这个private static方法使用反射,遍历DataTable dt中的每个DataRow row和列。 对于每一列,它在通用对象中搜索匹配的属性(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)
$vbLabelText   $csharpLabel

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

性能考虑事项

虽然反射方法非常强大,但值得注意的是,在处理大型数据表时,它可能会更慢。 衡量性能并将其与代码可重用性和可维护性的优点进行对比始终至关重要。

Iron Suite 工具包适用于 .NET 开发者

虽然我们已经深入探讨了在C#中将DataTable转换为列表的复杂性,但有时依赖外部工具可以简化我们的开发过程,特别是在处理更复杂的操作时。 这就是Iron Suite发挥作用的地方。

Iron Suite 是一个综合工具套件,旨在简化 .NET 开发人员的工作。 从PDF操作和Excel处理到光学字符识别(OCR)和条形码读取,Iron Suite 提供了大量功能。 让我们分解Iron Suite的组件,看看它们如何补充我们的DataTable操作。

IronPDF: PDF强大工具

C# DataTable 转为 List(开发者工作原理)图1 - IronPDF for .NET:C# PDF 库

当要在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");
    }
}
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
$vbLabelText   $csharpLabel

IronXL:擅长Excel操作

C# DataTable 转 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# DataTable 转换为列表(开发人员如何使用)图 4 - IronBarcode for .NET: C# 条码库

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

结论

C# DataTable 转换为 List(开发人员如何使用)图 5 - Iron Suite:许可信息

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

Chipego
软件工程师
Chipego 拥有出色的倾听技巧,这帮助他理解客户问题并提供智能解决方案。他在 2023 年加入 Iron Software 团队,此前他获得了信息技术学士学位。IronPDF 和 IronOCR 是 Chipego 主要专注的两个产品,但他对所有产品的了解每天都在增长,因为他不断找到支持客户的新方法。他喜欢 Iron Software 的合作氛围,公司各地的团队成员贡献他们丰富的经验,以提供有效的创新解决方案。当 Chipego 离开办公桌时,你经常可以发现他在看书或踢足球。
< 前一页
C#网络应用程序(开发人员如何使用)
下一步 >
C# 引用关键字(开发人员工作原理)