.NET幫助 C# Datatable 轉換為列表(開發者的工作原理) Curtis Chau 更新日期:6月 20, 2025 Download IronPDF NuGet 下載 DLL 下載 Windows 安裝程式 Start Free Trial Copy for LLMs Copy for LLMs Copy page as Markdown for LLMs Open in ChatGPT Ask ChatGPT about this page Open in Gemini Ask Gemini about this page Open in Grok Ask Grok about this page Open in Perplexity Ask Perplexity about this page Share Share on Facebook Share on X (Twitter) Share on LinkedIn Copy URL Email article 將 DataTable 轉為 C# 中的 List 在使用 C# 編程的過程中,經常需要將 DataTable 轉換為 List。 許多初學者在面對這個任務時,通常會遇到回答不夠全面的問題。 本教程旨在填補這一空白,提供關於如何在 C# 中將 DataTable 轉換為 List 的清晰指南。 什麼是 DataTable? 在深入了解轉換過程之前,了解什麼是 DataTable 是至關重要的。 在 C# 中,DataTable 對象是一種記憶體數據庫表的表示,包含行和列。 它是 System.Data 命名空間的一部分。 為了本教程的目的,我們使用一個名為 dt 的範例 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"); 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 轉換為 List: 使用 LINQ(語言集成查詢) 使用經典的 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 的擴展方法 AsEnumerable()。 這允許我們對 DataTable 中的每個 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 在 ForeachMethod 方法中,使用 foreach 循環迭代 DataTable。對於每個 DataRow,會實例化一個新的 Category 對象並添加到 list 中。 擴展高級轉換技術 在掌握 C# 中將 DataTable 轉換為 List 的基本知識之後,還有若干高級技術和考量,可以優化此過程並將其適應於更複雜的場景。 讓我們深入探討其中一些技術。 使用反射將 DataTable 轉換為 List 反射是 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)(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 此 ConvertDataTableToList 方法使用反射,迭代 DataTable 中的每個 DataRow 和列。 對於每個列,它查找通用對象中匹配的屬性並設置其值。 這種方法允許創建一個高度可重用的方法,可以將任何 DataTable 轉換為通用對象的 List。 用法 要使用上述代碼,只需指定類型來調用該方法: 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 套件工具包 雖然我們深入研究了在 C# 中將 DataTable 轉換為 List 的細節,但有時候,依賴外部工具可以簡化我們的開發過程,特別是當涉及到更複雜的操作時。 這就是 Iron Suite 的用武之地。 IronPDF:PDF 力量機器 當涉及到在 C# 中處理 PDF 時,IronPDF 是變革者。 想象一下將 DataTable 轉換為 List,然後需要從中生成 PDF 報告。 IronPDF 可以毫不費力地創建、編輯和提取 PDF 文檔中的數據,簡化了將數據表衍生的信息轉化為專業外觀報告的過程。 IronPDF 的主要特點是其 HTML 到 PDF 的功能,確保保留布局和樣式。 它從網頁內容生成 PDF,適合作為報告、發票和文檔。 您可以輕鬆地將 HTML 文件、URLs 和 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 操作 如果您的 DataTable 轉換需要進行 Excel 相關的操作,IronXL 是可以依靠的工具。 該產品提供了無縫操作,用於讀取、編輯和創建 Excel 試算表。 借助數據表到 List 的轉換,利用 IronXL 導出數據成 Excel 格式變得極其簡單。 IronOCR:讓文本可識別 有時候,您的 DataTable 可能包含基於圖像的數據,或者您需要從圖像中提取文本。 這就是 IronOCR 大放異彩的地方。 它允許 .NET 開發者從圖像中讀取文本,當您 的 DataTable 轉換操作涉及包含文本信息的圖像時,這是一個互補工具。 IronBarcode:閱讀條碼間的信息 最後,IronBarcode 是您應用程序中任何條碼操作的首選工具。 假設您的 DataTable 或您將其轉換為的 List 包含具有條碼的產品信息。 在這種情況下,IronBarcode 提供了一個有效的機制來讀取和生成條碼,在原始產品數據和可掃描條碼信息之間架起了一座橋樑。 結論 雖然手動方法對任何 C# 開發者操作和轉換 DataTable 都至關重要,但整合像 Iron Suite 提供的強大工具可以大幅提升您的生產效率和能力。 值得注意的是,每個產品的許可證起價為 $799,更具吸引力的是,每個產品都提供 免費試用。 如果您正在考慮投資這些工具,那麼有一個吸引人的提議:您可以 以僅兩個產品的價格獲得整個 Iron 套件。 採用這種全面的解決方案無疑能提升您 .NET 開發工作的質量和效率。 常見問題解答 什麼是 C# 中的 DataTable? C# 中的 DataTable 是一個在記憶體中的資料庫表格表示,由行和列組成。它是 System.Data 命名空間的一部分。 如何使用 LINQ 將 DataTable 轉換為 C# 中的清單? 您可以使用 LINQ 將 DataTable 轉換為清單,通過利用 AsEnumerable() 方法遍歷每個 DataRow 並使用 Select 創建代表每行的動態物件清單。 使用 foreach 迴圈在 C# 中將 DataTable 轉換為清單的過程是什麼? 要使用 foreach 迴圈將 DataTable 轉換為清單,請遍歷每個 DataRow,為每行實例化一個新物件,從 DataRow 中填充其屬性,然後將其添加到清單中。 反射如何增強 C# 中的 DataTable 轉換? 使用反射允許高度可重用的方法,通過動態地將 DataTable 列映射到物件屬性,將任何 DataTable 轉換為泛型物件清單。 IronPDF 如何幫助處理從 DataTables 派生的 PDF? IronPDF 允許開發人員創建、編輯和提取 PDF 文件中的數據,這對於生成從 DataTable 派生的數據報告非常有用。 IronXL 對於 C# 中的 Excel 操作有哪些優勢? IronXL 促進了從 DataTables 到 Excel 格式的數據導出,允許開發人員輕鬆地閱讀、編輯和創建 Excel 試算表。 IronOCR 可以以哪些方式應用於 DataTables? IronOCR 可以從 DataTables 中的圖像讀取文本,讓開發人員能夠處理含有文本信息的圖像數據。 IronBarcode 如何增強與條碼相關的 DataTable 操作? IronBarcode 提供讀取和生成條碼的能力,這對於包含條碼的產品信息的 DataTables 或清單很有利。 在使用反射進行 DataTable 轉換時需要考慮哪些性能因素? 雖然反射提供了靈活性,但尤其對於大型數據表來說,可能會比其他方法慢,因此需要平衡性能與重用性和可維護性。 Iron Software 產品是否有可用的授權和試用機會? 是的,文章提到 Iron Suite 產品有可用的授權和試用機會,允許開發人員在購買前評估這些工具。 Curtis Chau 立即與工程團隊聊天 技術作家 Curtis Chau 擁有卡爾頓大學計算機科學學士學位,專注於前端開發,擅長於 Node.js、TypeScript、JavaScript 和 React。Curtis 熱衷於創建直觀且美觀的用戶界面,喜歡使用現代框架並打造結構良好、視覺吸引人的手冊。除了開發之外,Curtis 對物聯網 (IoT) 有著濃厚的興趣,探索將硬體和軟體結合的創新方式。在閒暇時間,他喜愛遊戲並構建 Discord 機器人,結合科技與創意的樂趣。 相關文章 更新日期 9月 4, 2025 RandomNumberGenerator C# 使用RandomNumberGenerator C#類可以幫助將您的PDF生成和編輯項目提升至新水準 閱讀更多 更新日期 9月 4, 2025 C#字符串等於(它如何對開發者起作用) 當結合使用強大的PDF庫IronPDF時,開關模式匹配可以讓您構建更智能、更清晰的邏輯來進行文檔處理 閱讀更多 更新日期 8月 5, 2025 C#開關模式匹配(對開發者來說是如何工作的) 當結合使用強大的PDF庫IronPDF時,開關模式匹配可以讓您構建更智能、更清晰的邏輯來進行文檔處理 閱讀更多 C# 網頁應用(開發者的工作原理)C# Ref 關鍵字(開發者的工...