在实际环境中测试
在生产中测试无水印。
随时随地为您服务。
在使用C#编程的领域中,经常需要将DataTable
转换为列表。尽管许多初学者在执行此任务时会遇到困难,他们得到的解决方案往往不够全面。 本教程旨在缩小差距,并提供关于如何在 C# 中将 DataTable
转换为列表的清晰指南。
DataTable
?在深入了解转换过程之前,了解什么是数据表is. 在C#中,DataTable
对象表示一个具有行和列的内存数据库表。 它是 System.Data
命名空间的一部分。
在本教程中,让我们使用一个名为 DataTable dt
的示例 DataTable
。 DataTable 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")
那么,你已经有了你的DataTable dt
,现在你在看着它想,“我该如何转换这个?” 别担心; 这是一个显示研究努力的问题。 将DataTable
转换为列表主要有两种方法:
使用LINQ (语言综合查询)
foreach循环
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
注意使用 var list
、var row
和 linqmethod
。 在上述代码中,扩展方法 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
在 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
掌握了在 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
这个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)
有了这种方法,你就不再局限于将特定数据表转换为特定对象类型。取而代之的是一个多功能工具,可以处理各种数据情况。
虽然反射方法非常强大,但值得注意的是,在处理大型数据表时,它可能会更慢。 衡量性能并将其与代码可重用性和可维护性的优点进行对比始终至关重要。
虽然我们已经深入探讨了在C#中将DataTable
转换为列表的复杂性,但有时候,依赖外部工具可以简化我们的开发过程,特别是在处理更复杂的操作时。 这就是Iron Suite开始发挥作用。
Iron Suite是一套旨在简化.NET开发人员工作的综合工具。 从PDF操作和Excel操作到光学字符识别(光学字符识别)以及条形码读取,Iron Suite 提供多种功能。 让我们分解Iron Suite的组件,看看它们如何能够补充我们的DataTable
操作。
在使用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
如果您的 DataTable
转换需要处理与 Excel 相关的任务,IronXL是值得依赖的工具。 该产品在读取、编辑和创建Excel电子表格方面提供无缝操作。 借助数据表到列表的转换功能,使用IronXL将数据导出为Excel格式变得非常简单。
有时候,您的 DataTable
可能包含基于图像的数据,或者您需要从图像中提取文本。 这就是IronOCR闪耀。 它允许 .NET 开发人员从图像中读取文本,如果您的 DataTable
转换操作涉及包含文本信息的图像,则这是一个补充工具。
最后,IronBarcode是您应用程序中任何条码操作的首选工具。 假设您的 DataTable
或您将其转换为的列表包含带有条形码的产品信息。 在这种情况下,IronBarcode 提供了一种高效的机制来读取和生成条形码,填补了原始产品数据与可扫描条形码信息之间的空白。
尽管手动方法操作和转换DataTable
对任何C#开发人员来说都是至关重要的,但整合像Iron Suite提供的强大工具可以成倍地提高您的工作效率和能力。 值得注意的是,每个产品许可都是从$749开始的,更吸引人的是,每个产品都提供一个免费试用. 如果您正在考虑投资这些工具,桌上有一个诱人的提议:您可以获得整个铁套房只需两件产品的价格。 采用这样全面的解决方案无疑可以提升您 .NET 开发工作的质量和效率。