在实际环境中测试
在生产中测试无水印。
随时随地为您服务。
在使用 C# 编程的过程中,经常需要将 "数据表 "转换为列表。虽然许多新手都会遇到这种情况,但得到的答案往往不够全面。本教程旨在弥合这一差距,并就如何在 C# 中将 DataTable
转换为 list 提供清晰的指导。
在深入了解转换过程之前,了解什么是 数据表 是。在 C# 中,"DataTable "对象是一个内存数据库表的表示,其中包含行和列。它是 System.Data
命名空间的一部分。
在本教程中,我们使用一个名为 DataTable dt
的示例 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
转换为列表主要有两种方法:
1.使用 LINQ (语言综合查询)
2.使用经典的 `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` 上使用 LINQ。
Foreach
循环进行转换在 C# 中,"foreach 循环 "是迭代集合的一种久经考验的方法。这种方法可能看起来有点长,但很容易理解和实现。
让我们开始吧:
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 循环 "遍历 "数据表"。对于每一条 "数据行",都会实例化一个新的 "var 类别 "对象,并将其添加到 "var 列表 "中。
要表示类别,您需要一个类:
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
此 "私有静态 "方法使用反射,遍历 "数据表 dt "中的每一行 "数据行 "和每一列。对于每一列,它都会搜索匹配的属性 (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 改变了游戏规则。试想一下,将您的 "数据表 "转换为列表,然后需要从中生成 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开发工作的质量和效率。