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 Classlistに追加されます。
高度な変換技術の拡張
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 to 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は生の製品データとスキャン可能なバーコード情報との間のギャップを埋める効率的なメカニズムを提供します。
結論
C#開発者にとってDataTableの操作と変換の手動方法は重要ですが、Iron Suiteが提供する強力なツールを統合することで、生産性と能力を飛躍的に向上させることができます。 注目すべき点は、各製品ライセンスが$999から始まることと、各製品が無料トライアルを提供していることです。 これらのツールへの投資を検討しているなら、興味を引く提案があります:あなたはIron Suite全体を、たった2つの製品の価格で取得できます。 このような包括的なソリューションを採用することで、間違いなく.NET開発の質と効率を向上させることができます。
ジェイコブ・メラーはIron Softwareの最高技術責任者(CTO)であり、C# PDFテクノロジーを開拓する先見的なエンジニアです。Iron Softwareのコアコードベースを支えるオリジナル開発者として、彼は創業以来、会社の製品アーキテクチャを形成し、CEOのCameron Rimingtonとともに、会社をNASA、Tesla、および世界的な政府機関にサービスを提供する50人以上の会社に変えました。1999年にロンドンで最初のソフトウェアビジネスを開業し、2005年に最初 for .NETコンポーネントを作成した後、Microsoftのエコシステム全体で複雑な問題を解決することを専門としました。