.NET 帮助

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

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

在使用C#编程的领域中,经常需要将DataTable转换为列表。尽管许多初学者在执行此任务时会遇到困难,他们得到的解决方案往往不够全面。 本教程旨在缩小差距,并提供关于如何在 C# 中将 DataTable 转换为列表的清晰指南。

什么是DataTable

在深入了解转换过程之前,了解什么是数据表is. 在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")
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 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
VB   C#

private static void ForeachMethod()方法中,通过foreach 循环迭代DataTable。 对于每个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
VB   C#

扩展高级转换技术

掌握了在 C# 中将 DataTable 转换为列表的基本知识后,可以使用多种高级技术和考虑因素来优化此过程并适应更复杂的场景。 让我们更深入地探讨其中一些技术。

先前讨论的方法之一的局限性是它们仅限于我们的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
VB   C#

这个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)
VB   C#

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

性能考虑事项

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

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

虽然我们已经深入探讨了在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是一个颠覆者。 想象一下,您已经将 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
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.12 刚刚发布

免费NuGet下载 总下载量: 11,781,565 查看许可证 >