Przejdź do treści stopki
POMOC .NET

Tabela danych C# do listy (jak to działa dla programistów)

Konwersja DataTable na listę w języku C

W programowaniu w języku C# często pojawia się potrzeba konwersji DataTable na listę. Wielu początkujących napotyka to zadanie, ale odpowiedzi, które znajdują, często są niewystarczająco wyczerpujące. Niniejszy samouczek ma na celu wypełnienie tej luki i dostarczenie jasnego przewodnika dotyczącego konwersji DataTable na listę w języku C#.

Czym jest DataTable?

Przed zagłębieniem się w proces konwersji, niezbędne jest zrozumienie, czym jest DataTable. W języku C# obiekt DataTable jest reprezentacją tabeli bazy danych w pamięci operacyjnej z wierszami i kolumnami. Jest częścią przestrzeni nazw System.Data.

Na potrzeby tego samouczka użyjemy przykładowej DataTable o nazwie dt. Można ją zwizualizować jak poniżej:

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

Pierwsze kroki z konwersją

Masz więc swoją DataTable dt i zastanawiasz się: „Jak to przekonwertować?". Nie martw się — to pytanie świadczące o chęci poszerzania wiedzy. Istnieją głównie dwie metody konwersji DataTable na listę:

  1. Using LINQ (Language Integrated Query)
  2. Using the classic foreach loop

Konwersja przy użyciu LINQ

Metoda LINQ jest potężnym narzędziem w języku C#, które zapewnia deklaratywny sposób odpytywania kolekcji. Przyjrzyjmy się, jak można to zrobić.

Zdefiniuj metodę w następujący sposób:

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

W powyższym kodzie metoda rozszerzająca AsEnumerable() jest wywoływana na DataTable dt. Pozwala to używać LINQ na każdym DataRow w DataTable. Metoda tworzy listę obiektów dynamicznych, z których każdy reprezentuje wiersz z DataTable.

Konwersja przy użyciu pętli foreach

Pętla foreach to sprawdzony sposób iterowania po kolekcjach w języku C#. Ta metoda może wydawać się nieco dłuższa, ale jest łatwa do zrozumienia i implementacji.

Oto jak to działa:

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

W metodzie ForeachMethod DataTable jest iterowana przy użyciu pętli foreach. Dla każdego DataRow tworzony jest nowy obiekt Category i dodawany do listy list.

Rozszerzenie o zaawansowane techniki konwersji

Po opanowaniu podstaw konwersji DataTable na listę w języku C# istnieje kilka zaawansowanych technik i kwestii, które mogą zoptymalizować ten proces i dostosować go do bardziej złożonych scenariuszy. Zagłębmy się w niektóre z tych technik.

Użycie refleksji do konwersji DataTable na listę

Refleksja to potężne narzędzie w języku C#, które umożliwia sprawdzanie metadanych typów w czasie wykonywania. Wykorzystajmy jej możliwości:

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 Function
$vbLabelText   $csharpLabel

Metoda ConvertDataTableToList wykorzystuje refleksję, iterując po każdym DataRow i kolumnie w DataTable. Dla każdej kolumny wyszukuje pasującą właściwość w obiekcie generycznym i ustawia jej wartość. To podejście umożliwia stworzenie wysoce wielokrotnie używalnej metody, która może konwertować dowolną DataTable na listę obiektów generycznych.

Zastosowanie

Aby użyć powyższego kodu, wystarczy wywołać metodę, określając typ:

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

Dzięki tej metodzie nie jesteś już ograniczony do konwersji konkretnych tabel danych na określone typy obiektów. Zamiast tego masz do dyspozycji wszechstronne narzędzie, które może obsługiwać różnorodne scenariusze danych.

Kwestie związane z wydajnością

Chociaż metoda refleksji jest potężna, warto zauważyć, że może działać wolniej, zwłaszcza w przypadku dużych tabel danych. Zawsze kluczowe znaczenie ma pomiar wydajności i porównanie jej z korzyściami wynikającymi z możliwości ponownego wykorzystania kodu oraz łatwości jego utrzymania.

Zestaw narzędzi Iron Suite for .NET dla programistów

Chociaż zagłębiliśmy się w zawiłości konwersji DataTable na listy w języku C#, czasami poleganie na zewnętrznych narzędziach może uprościć nasz proces tworzenia, szczególnie w przypadku bardziej złożonych operacji. Właśnie tu do gry wkracza Iron Suite.

IronPDF: Potęga w formacie PDF

C# DataTable to List (How It Works For Developers) Figure 1 - IronPDF for .NET: The C# PDF Library

Jeśli chodzi o pracę z plikami PDF w języku C#, IronPDF to przełomowe rozwiązanie. Wyobraź sobie, że przekonwertowałeś swoją DataTable na listę i teraz potrzebujesz wygenerować z niej raport PDF. IronPDF pozwala bez wysiłku tworzyć, edytować i wyodrębniać dane z dokumentów PDF, usprawniając proces przekształcania informacji pochodzących z tabel danych w profesjonalnie wyglądające raporty.

Główną cechą IronPDF jest funkcja konwersji HTML do PDF, która zapewnia zachowanie układów i stylów. Generuje pliki PDF na podstawie treści internetowych, odpowiednie do raportów, faktur i dokumentacji. Możesz bez wysiłku konwertować pliki HTML, adresy URL i ciągi znaków HTML na pliki 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: Doskonałość w operacjach w programie Excel

C# DataTable to List (How It Works For Developers) Figure 2 - IronXL for .NET: The C# Excel Library

Jeśli konwersja DataTable prowadzi do potrzeby wykonywania zadań związanych z programem Excel, IronXL jest właściwym narzędziem. Ten produkt zapewnia płynne operacje odczytu, edycji i tworzenia arkuszy kalkulacyjnych Excel. Dzięki funkcji konwersji tabeli danych na listę eksportowanie danych do formatu Excel staje się niezwykle proste dzięki IronXL.

IronOCR: Umożliwianie rozpoznawania tekstu

C# DataTable to List (How It Works For Developers) Figure 3 - IronOCR for .NET: The C# OCR Library

Mogą zdarzać się sytuacje, gdy DataTable zawiera dane oparte na obrazach lub trzeba wyodrębnić tekst z obrazów. Właśnie w tym IronOCR pokazuje swoją siłę. Umożliwia programistom .NET odczytywanie tekstu z obrazów, czyniąc go uzupełniającym narzędziem, gdy operacje konwersji DataTable obejmują obrazy zawierające informacje tekstowe.

IronBarcode: Czytanie między wierszami

C# DataTable to List (How It Works For Developers) Figure 4 - IronBarcode for .NET: The C# Barcode Library

Wreszcie, IronBarcode to niezbędne narzędzie do wszelkich operacji związanych z kodami kreskowymi w Twoich aplikacjach. Załóżmy, że Twoja DataTable lub lista, na którą ją przekonwertowałeś, zawiera informacje o produktach z kodami kreskowymi. W tym przypadku IronBarcode zapewnia wydajny mechanizm odczytu i generowania kodów kreskowych, wypełniając lukę między surowymi danymi produktu a informacjami zawartymi w kodach kreskowych, które można zeskanować.

Wnioski

C# DataTable to List (How It Works For Developers) Figure 5 - Iron Suite: License information

Chociaż ręczne metody manipulowania i konwersji DataTable są kluczowe dla każdego programisty C#, integracja potężnych narzędzi dostarczanych przez Iron Suite może wykładniczo zwiększyć Twoją produktywność i możliwości. Warto zauważyć, że każda licencja produktu zaczyna się od $799, a co jeszcze bardziej kusi, każdy produkt oferuje bezpłatną wersję próbną. Jeśli rozważasz inwestycję w te narzędzia, mamy dla Ciebie atrakcyjną ofertę: możesz nabyć cały pakiet Iron Suite za cenę zaledwie dwóch produktów. Wdrożenie tak kompleksowych rozwiązań bez wątpienia podniesie jakość i wydajność Twoich przedsięwzięć związanych z programowaniem w środowisku .NET.

Często Zadawane Pytania

Czym jest DataTable w C#?

DataTable w C# to reprezentacja tabeli bazy danych w pamieci, skladajaca sie z wierszy i kolumn. Jest czescia przestrzeni nazw System.Data.

Jak moge przeksztalcic DataTable w liste w C# uzywajac LINQ?

Mozesz przeksztalcic DataTable w liste za pomoca LINQ, uzywajac metody AsEnumerable(), aby iterowac po kazdym DataRow, i uzywajac Select, aby stworzyc liste dynamicznych obiektow reprezentujacych kazdy wiersz.

Jaki jest proces przeksztalcania DataTable w liste za pomoca petli foreach w C#?

Aby przeksztalcic DataTable w liste przy uzyciu petli foreach, iteruj po kazdym DataRow, tworz nowy obiekt dla kazdego wiersza, uzupelnij jego wlasciwosci z DataRow, i dodaj go do listy.

Jak refleksja ulepsza przeksztalcanie DataTable w C#?

Uzywanie refleksji pozwala na stworzenie wysoce wielokrotnego uzytku metody, ktora moze przeksztalcic dowolne DataTable w liste obiektow generycznych, dynamicznie mapujac kolumny DataTable na wlasciwosci obiektu.

Jak IronPDF moze pomoc w obsludze PDF z DataTable?

IronPDF pozwala deweloperom na tworzenie, edytowanie i wyciaganie danych z dokumentow PDF, co jest przydatne do generowania raportow z danych pochodzacych z DataTable.

Jakie korzysci zapewnia IronXL dla operacji na Excelu w C#?

IronXL ulatwia eksport danych z DataTable do formatu Excel, pozwalajac deweloperom na latwe odczytywanie, edytowanie i tworzenie arkuszy Excel w efektywny sposob.

W jaki sposob IronOCR moze byc zastosowany do DataTable?

IronOCR moze odczytywac tekst z obrazow w DataTable, umozliwiajac deweloperom obsluge danych obrazowych zawierajacych informacje tekstowe.

Jak IronBarcode ulepsza operacje na DataTable za pomoca kodow kreskowych?

IronBarcode umozliwia odczytywanie i generowanie kodow kreskowych, co jest korzystne dla DataTable lub list zawierajacych informacje o produktach z kodami kreskowymi.

Jakie uwagi dotyczace wydajnosci nalezy wziac pod uwage przy uzywaniu refleksji do przeksztalcania DataTable?

Chociaz refleksja oferuje elastycznosc, moze byc wolniejsza niz inne metody, zwlaszcza przy duzych tabelach danych. Wazne jest, aby zachowac rownowage miedzy wydajnoscia a wielokrotnego uzytku i utrzymaniem.

Czy istnieja mozliwosci licencjonowania i wersji probnych dla produktow Iron Software?

Tak, artykul wspomina, ze istnieja mozliwosci licencjonowania i wersji probnych dla produktow Iron Suite, pozwalajace deweloperom ocenic narzedzia przed podjeciem decyzji o zakupie.

Jacob Mellor, Dyrektor Technologiczny @ Team Iron
Dyrektor ds. technologii

Jacob Mellor jest Chief Technology Officer w Iron Software i wizjonerskim inżynierem, pionierem technologii C# PDF. Jako pierwotny deweloper głównej bazy kodowej Iron Software, kształtuje architekturę produktów firmy od jej początku, przekształcając ją wspólnie z CEO Cameron Rimington w firmę liczą...

Czytaj więcej

Zespol wsparcia Iron

Jestesmy online 24 godziny, 5 dni w tygodniu.
Czat
Email
Zadzwon do mnie