跳至頁尾內容
開發者更新

C# Datatable 轉換為列表(開發者的工作原理)

Converting DataTable to List in C

在使用C#進行編程時,經常需要將DataTable轉換為列表。雖然許多新手在這項任務上遇到困難,但他們常常得到的答案不夠全面。 本教程旨在彌合這一差距,並提供關於如何在C#中將DataTable轉換為列表的明確指南。

什麼是DataTable

在深入了解轉換過程之前,至關重要的是要了解什麼是DataTable。 在C#中,DataTable物件表示一個具有行和列的記憶體中資料庫表。 它是System.Data命名空間的一部分。

為了本教程的目的,讓我們使用一個名為dt。 這可以如下所示地可視化:

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

Private 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#中一個強大的工具,提供了一種聲明式方式來查詢集合。 讓我們看看如何做到這一點。

定義一個方法如下所示:

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();
}
'INSTANT VB NOTE: 'Option Strict Off' is used here since dynamic typing is used:
Option Strict Off

Imports System.Linq
Imports System.Collections.Generic

'INSTANT VB NOTE: In the following line, Instant VB substituted 'Object' for 'dynamic' - this will work in VB with Option Strict Off:
Private Shared Function LinqMethod(ByVal dt As DataTable) As List(Of Object)
	Return dt.AsEnumerable().Select(Function(row) New With {
		Key .ID = row.Field(Of Integer)("ID"),
		Key .Category = row.Field(Of String)("Category")
	}).ToList()
End Function
$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; }
}
Private Shared Function ForeachMethod(ByVal dt As DataTable) As List(Of Category)
	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 With {
			.ID = Convert.ToInt32(row("ID")),
			.Name = row("Category").ToString()
		}
		list.Add(category)
	Next row
	Return list
End Function

Public Class Category
	Public Property ID() As Integer
	Public Property Name() As String
End Class
$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;
}
Imports System.Reflection

Private Shared Function ConvertDataTableToList(Of T As New)(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
        list.Add(obj)
    Next
    Return list
End Function
$vbLabelText   $csharpLabel

DataRow和列上進行迭代。 對於每個列,它會搜尋通用物件中的匹配屬性並設置其值。 這種方法允許建立一個高度可重用的方法,可以將任何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

使用此方法,您不再局限於將特定資料表轉換為特定物件型別。取而代之的是,您有一個多功能工具,能處理各種資料場景。

性能考量

雖然反射方法很強大,但值得注意的是,特別是對於大型資料表,它可能會比較慢。 衡量性能始終是至關重要的,並將其與程式碼的可重用性和可維護性效益進行比較。

為 .NET 開發人員準備的 Iron Suite 工具組

雖然我們深入探討了在C#中將DataTable轉換為列表的細節,但有時依賴外部工具可以簡化我們的開發過程,尤其是在涉及更複雜的操作時。 這就是Iron Suite的作用所在。

IronPDF:PDF的強大幫手

C# DataTable to List (How It Works For Developers) Figure 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");
    }
}
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 to List (How It Works For Developers) Figure 2 - IronXL for .NET: The C# Excel Library

如果您的DataTable轉換需要進行與Excel相關的任務,IronXL就是可轉向的工具。 該產品提供無縫讀取、編輯和建立Excel電子表格的操作。 有了從資料表到列表的轉換在手,在IronXL的幫助下,將資料導出為Excel格式變得極其簡單。

IronOCR:使文字變得可識別

C# DataTable to List (How It Works For Developers) Figure 3 - IronOCR for .NET: The C# OCR Library

有時,當您的DataTable包含基於圖像的資料或需要從圖像中提取文字時, 這就是IronOCR發揮作用的地方。 它允許 .NET 開發人員從圖像中讀取文字,如果您的DataTable轉換操作涉及到含有文字資訊的圖像時,它是一個很好的補充工具。

IronBarcode:注釋間的閱讀

C# DataTable to List (How It Works For Developers) Figure 4 - IronBarcode for .NET: The C# Barcode Library

最後,IronBarcode是您的應用中任何條碼操作的首選工具。 假設您的DataTable或您已將其轉換為的列表包含了商品資訊和條形碼。 在這種情況下,IronBarcode提供了一種高效的機制來閱讀和生成條碼,彌補了原始產品資料和可掃描的條碼資訊之間的差距。

結論

C# DataTable to List (How It Works For Developers) 圖5 - Iron Suite: 授權資訊

雖然手動操控和轉換DataTable的方法對於任何C#開發者來說都是至關重要的,但整合像Iron Suite提供的強大工具可以指數式地提升您的生產力和能力。 值得注意的是,每個產品的授權都從$999開始,更令人吸引的是,每個產品都提供免費試用。 如果您考慮投資這些工具,有一個很誘人的優惠:您可以以兩個產品的價格獲得整個Iron Suite。 接受這樣的綜合解決方案,無疑會提升您.NET開發工作的質量和效率。

常見問題

什麼是C#中的DataTable?

C#中的DataTable是資料庫表的記憶體表示,由行和列組成。它是System.Data命名空間的一部分。

我怎樣才能使用LINQ在C#中將DataTable轉換為清單?

您可以通過利用AsEnumerable()方法來迭代每個DataRow,並使用Select來建立表示每一行的動態物件清單,從而將DataTable轉換為清單。

使用foreach迴圈在C#中將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一起將公司轉變為服務於NASA、特斯拉和全球政府公司的50多名人員的公司。

Jacob擁有曼徹斯特大學的土木工程一等榮譽學士學位(BEng),於1998-2001年之間獲得。在1999年於倫敦創辦他的第一家軟體公司並於2005年建立了他的第一批.NET元組件後,他專注於解決Microsoft生態系統中的複雜問題。

他的旗艦IronPDF和Iron Suite .NET程式庫在全球獲得了超過3000萬次NuGet安裝依據,他的基礎程式碼基繼續支援著世界各地開發者使用的工具。擁有25年的商業經驗和41年的程式設計專業知識,他仍專注於推動企業級C#、Java和Python PDF技術的創新,同時指導下一代技術領導者。

Iron 支援團隊

我們線上24小時,每週5天。
聊天
電子郵件
給我打電話