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");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")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")開始進行轉換
所以,您已經獲得了您的DataTable dt,現在您正在凝視它思考,"我該如何轉換這個?" 別擔心; 這是一個顯示研究努力的問題。 主要有兩種方法可以將DataTable轉換為列表:
- 使用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'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在上述程式碼中,擴展方法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 ClassPrivate 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在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 FunctionImports 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此DataRow和列上進行迭代。 對於每個列,它會搜尋通用物件中的匹配屬性並設置其值。 這種方法允許建立一個高度可重用的方法,可以將任何DataTable轉換為泛型物件的列表。
用法
要使用上述程式碼,只需通過指定型別來調用該方法:
List<Category> categories = ConvertDataTableToList<Category>(dt);List<Category> categories = ConvertDataTableToList<Category>(dt);Dim categories As List(Of Category) = ConvertDataTableToList(Of Category)(dt)Dim categories As List(Of Category) = ConvertDataTableToList(Of Category)(dt)使用此方法,您不再局限於將特定資料表轉換為特定物件型別。取而代之的是,您有一個多功能工具,能處理各種資料場景。
性能考量
雖然反射方法很強大,但值得注意的是,特別是對於大型資料表,它可能會比較慢。 衡量性能始終是至關重要的,並將其與程式碼的可重用性和可維護性效益進行比較。
為 .NET 開發人員準備的 Iron Suite 工具組
雖然我們深入探討了在C#中將DataTable轉換為列表的細節,但有時依賴外部工具可以簡化我們的開發過程,尤其是在涉及更複雜的操作時。 這就是Iron Suite的作用所在。
IronPDF: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 ClassImports 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 ClassIronXL:在Excel操作中取得卓越

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

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

最後,IronBarcode是您的應用中任何條碼操作的首選工具。 假設您的DataTable或您已將其轉換為的列表包含了商品資訊和條形碼。 在這種情況下,IronBarcode提供了一種高效的機制來閱讀和生成條碼,彌補了原始產品資料和可掃描的條碼資訊之間的差距。
結論
雖然手動操控和轉換DataTable的方法對於任何C#開發者來說都是至關重要的,但整合像Iron Suite提供的強大工具可以指數式地提升您的生產力和能力。 值得注意的是,每個產品的授權都從$999開始,更令人吸引的是,每個產品都提供免費試用。 如果您考慮投資這些工具,有一個很誘人的優惠:您可以以兩個產品的價格獲得整個Iron Suite。 接受這樣的綜合解決方案,無疑會提升您.NET開發工作的質量和效率。
Jacob Mellor是Iron Software的首席技術官,一位在C# PDF技術上開創先河的遠見工程師。作為Iron Software核心程式碼庫的原開發者,他從創立以來就一直在塑造公司的產品架構,與首席執行官Cameron Rimington一起將公司轉變為服務於NASA、特斯拉和全球政府公司的50多名人員的公司。