在生产环境中测试,无水印。
随时随地满足您的需求。
获得30天的全功能产品。
几分钟内就能启动并运行。
在您的产品试用期间,全面访问我们的支持工程团队。
在使用 C# 编程的领域中,经常需要将DataTable
转换为列表。虽然许多初学者在这项任务上遇到了困难,但他们往往得到的答案还不够全面。 本教程旨在弥合这一差距,并提供一个关于如何在 C# 中将 DataTable
转换为列表的清晰指南。
DataTable
?在深入了解转换过程之前,了解什么是DataTable
是至关重要的。 在 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()
方法中,DataTable
使用foreach 循环
进行迭代。 对于每个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
在掌握了将DataTable
转换为C#列表的基本知识后,有几个高级技术和注意事项可以优化这一过程并使其适应更复杂的场景。 让我们更深入地探讨其中一些技术。
之前讨论的方法的其中一个限制是它们仅适用于我们的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处理到光学字符识别(OCR)和条形码读取,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,更吸引人的是,每个产品都提供免费试用。 如果您正在考虑投资这些工具,这里有一个诱人的优惠:您可以以仅仅两个产品的价格获取整个 Iron Suite。 采用这样全面的解决方案无疑可以提升您 .NET 开发工作的质量和效率。