フッターコンテンツにスキップ
.NETヘルプ

C# データテーブルをリストに変換する (デベロッパー向けの仕組み)

DataTableをC#でリストに変換する

C#でプログラミングをする際、DataTableをリストに変換する必要が生じることがしばしばあります。このタスクに直面する多くの初心者は、十分に包括的でない回答に直面します。 このチュートリアルはそのギャップを埋め、C#でDataTableをリストに変換する方法について明確なガイドを提供することを目的としています。

DataTableとは何ですか?

変換プロセスに入る前に、DataTableが何であるかを理解することが重要です。 C#では、DataTableオブジェクトは、行と列を持つメモリ内データベーステーブルの表現です。 それはSystem.Data名前空間の一部です。

このチュートリアルの目的のために、dtという名前のサンプル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");
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")
$vbLabelText   $csharpLabel

変換を始める

それで、あなたはDataTable dtを手に入れ、今、「どうやってこれを変換するのか?」と考え込んでいます。 心配いりません; それは研究努力を示す質問です。 DataTableをリストに変換するには主に2つの方法があります:

  1. LINQ(言語統合クエリ)を使う方法
  2. クラシックな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
$vbLabelText   $csharpLabel

上記のコードでは、拡張メソッドAsEnumerable()DataTable dtで呼び出されます。 これにより、DataTableの各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 Class
$vbLabelText   $csharpLabel

ForeachMethodメソッドでは、DataTableforeachループを使って反復処理されます。各DataRowに対して、新しいCategoryオブジェクトがインスタンス化され、そのリストに追加されます。

高度な変換技術の拡張

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)(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
$vbLabelText   $csharpLabel

このConvertDataTableToListメソッドは反射を使用し、DataTableの各DataRowおよび列を反復処理します。 各列について、ジェネリックオブジェクトのマッチするプロパティを検索してその値を設定します。 このアプローチにより、あらゆるDataTableをジェネリックオブジェクトのリストに変換できる高度に再利用可能なメソッドであることが保証されます。

使用方法

上記のコードを使うには、単に型を指定してメソッドを呼び出します:

List<Category> categories = ConvertDataTableToList<Category>(dt);
List<Category> categories = ConvertDataTableToList<Category>(dt);
Dim categories As List(Of Category) = ConvertDataTableToList(Of Category)(dt)
$vbLabelText   $csharpLabel

この方法を使えば、特定のデータテーブルを特定のオブジェクトタイプに変換することに限定されることはありません。代わりに、多様なデータシナリオを扱える柔軟なツールを手にすることができます。

パフォーマンスの考慮事項

反射メソッドは強力ですが、大規模なデータテーブルの場合特に遅くなる可能性があることを知っておく価値があります。 パフォーマンスを測定し、コードの再利用性と保守性のメリットと比較検討することが常に重要です。

.NET開発者向けのIron Suiteツールキット

DataTableをC#でリストに変換する詳細にまで深掘りしましたが、複雑な操作に関しては特に、外部ツールに頼ると開発プロセスがシンプルになることもあります。 それがIron Suiteの出番です。

IronPDF: PDFのパワーハウス

C# DataTableをリストに(開発者向けとしてどのように機能するか)図1 - IronPDF for .NET: C# 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 Class
$vbLabelText   $csharpLabel

IronXL: Excel操作における卓越性

C# DataTableをリストに(開発者向けとしてどのように機能するか)図2 - IronXL for .NET: C# Excelライブラリ

DataTableの変換がExcel関連のタスクに導かれる場合は、IronXLが頼りにできるツールです。 この製品はExcelスプレッドシートの読み取り、編集、作成のためのスムーズな操作を提供します。 データテーブルのリストへの変換が完了すれば、あなたのデータをExcelフォーマットにエクスポートするのがIronXLで非常に簡単になります。

IronOCR: 認識可能なテキストを作る

C# DataTableをリストに(開発者向けとしてどのように機能するか)図3 - IronOCR for .NET: C# OCRライブラリ

おそらくDataTableには画像ベースのデータが含まれている時や、画像からテキストを抽出したい場合があります。 これがIronOCRが活躍する場です。 .NET開発者が画像からテキストを読み取ることを可能にし、DataTable変換操作がテキスト情報を含む画像を伴う場合に補完的なツールとなります。

IronBarcode: ラインの間を読む

C# DataTableをリストに(開発者向けとしてどのように機能するか)図4 - IronBarcode for .NET: C# Barcodeライブラリ

最後に、IronBarcodeはあなたのアプリケーション内での任意のバーコード操作のための頼りにできるツールです。 もしあなたのDataTableや、それを変換したリストにバーコード付きの製品情報が含まれているとしたら、 その場合、IronBarcodeは効率的なメカニズムを提供し、製品データを生のままバーコード情報に変換します。

結論

C# DataTableをリストに(開発者向けとしてどのように機能するか)図5 - Iron Suite: ライセンス情報

C#開発者にとってDataTableを操作し変換する手動メソッドは重要ですが、Iron Suiteが提供する強力なツールを統合することで、生産性と能力が飛躍的に向上します。 各製品ライセンスは$799から開始し、さらに魅力的なのはどの製品でも<無料トライアルを提供していることです。 これらのツールへの投資を検討しているなら、興味を引く提案があります:あなたはIron Suite全体を、たった2つの製品の価格で取得できます。 このような包括的なソリューションを採用することで、間違いなく.NET開発の質と効率を向上させることができます。

よくある質問

C#のDataTableとは?

C#のDataTableはデータベーステーブルをメモリー内で表現したもので、行と列が存在します。System.Data名前空間の一部です。

LINQを使用してC#でDataTableをリストに変換する方法は?

LINQを使用してDataTableをリストに変換するには、AsEnumerable()メソッドを使用して各DataRowを反復処理し、Selectを使用して各行を表す動的なオブジェクトのリストを作成します。

C#でforeachループを使用してDataTableをリストに変換するプロセスは?

foreachループを使用してDataTableをリストに変換するには、各DataRowを反復処理し、新しいオブジェクトを各行に対して生成し、そのプロパティをDataRowから取得してリストに追加します。

C#でリフレクションがDataTableの変換をどのように強化するか?

リフレクションを使用することで、DataTableの列をオブジェクトに動的にマッピングし、汎用オブジェクトのリストに変換する再利用性の高いメソッドが実現します。

DataTableから派生したPDFを扱うのにIronPDFがどのように役立つか?

IronPDFは開発者がPDFドキュメントを作成、編集、抽出するのを可能にし、DataTable派生データからレポートを生成するのに役立ちます。

C#でExcel操作する際のIronXLの利点は?

IronXLはDataTableからExcel形式へのデータエクスポートを可能にし、開発者がExcelスプレッドシートを簡単に読み取り、編集、作成するのを効率的にサポートします。

IronOCRがDataTableにどのように適用されるか?

IronOCRはDataTable内の画像からテキストを読み取ることが可能で、テキスト情報を含む画像ベースのデータを扱うことを開発者に可能にします。

IronBarcodeが、バーコードを用いてDataTable操作をどのように向上させるか?

IronBarcodeはバーコードの読み取りと生成機能を提供し、バーコードを含む製品情報を含むDataTableまたはリストに有益です。

DataTableの変換にリフレクションを使用する際に留意すべきパフォーマンス面の考慮事項は?

リフレクションは柔軟性を提供しますが、特に大規模なデータテーブルでは他の方法よりも遅くなる可能性があるため、パフォーマンスを再利用性と保守性のバランスを取ることが重要です。

Iron Software製品にはライセンシングとトライアルの機会があるか?

はい、記事では、Iron Suite製品のライセンシングとトライアルの機会があることが述べられており、開発者は購入前にツールを評価できます。

Curtis Chau
テクニカルライター

Curtis Chauは、カールトン大学でコンピュータサイエンスの学士号を取得し、Node.js、TypeScript、JavaScript、およびReactに精通したフロントエンド開発を専門としています。直感的で美しいユーザーインターフェースを作成することに情熱を持ち、Curtisは現代のフレームワークを用いた開発や、構造の良い視覚的に魅力的なマニュアルの作成を楽しんでいます。

開発以外にも、CurtisはIoT(Internet of Things)への強い関心を持ち、ハードウェアとソフトウェアの統合方法を模索しています。余暇には、ゲームをしたりDiscordボットを作成したりして、技術に対する愛情と創造性を組み合わせています。