C# 数据表转列表(开发者如何使用)
Converting DataTable to List in C#
在用C#编程的领域中,经常需要将DataTable转换为列表。虽然许多新手在这项任务上会遇到困难,但他们常常得到的答案并不够全面。 本教程旨在弥合这一差距,提供关于如何在C#中将DataTable转换为列表的清晰指南。
什么是DataTable?
在深入了解转换过程之前,关键是要理解什么是DataTable。 在C#中,DataTable对象是一个内存中具有行和列的数据库表的表示。 它是System.Data命名空间的一部分。
在本教程中,我们将使用一个名为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");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中。
扩展高级转换技术
在掌握了将DataTable转换为C#列表的基础知识后,有几种高级技术和考虑事项可以优化这一过程,并使其适应更复杂的场景。 让我们深入研究这些技术。
使用反射将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这种DataTable中的每一个。 对于每个列,它会搜索通用对象中的匹配属性并设置其值。 这种方法允许创建一个高度可重用的方法,可以将任何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电子表格。 有了数据表到列表的转换,导出数据到Excel格式变得非常简单,只需使用IronXL即可。
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 一起将公司转变为一家拥有 50 多名员工的公司,为 NASA、特斯拉和全球政府机构提供服务。