Przejdź do treści stopki
POMOC .NET

C# Orderby (jak to działa dla programistów)

Sortowanie jest podstawową operacją w każdym języku programowania, a metoda OrderBy w języku C# jest potężnym narzędziem do porządkowania elementów w kolekcjach. Niezależnie od tego, czy pracujesz z tablicami, listami czy innymi strukturami, które można wyliczać, zrozumienie, jak wykorzystać OrderBy, może znacznie poprawić czytelność i funkcjonalność Twojego kodu.

W dalszej części tego artykułu przedstawimy bibliotekę IronPDF firmy Iron Software oraz sposób, w jaki można wykorzystać metodę LINQ OrderBy i IronPDF do generowania sformatowanych i posortowanych plików PDF.

Czym jest metoda LINQ OrderBy?

Metoda OrderBy jest częścią biblioteki LINQ (Language-Integrated Query) w języku C# i została zaprojektowana specjalnie do sortowania elementów w porządku rosnącym; Ponieważ jest to domyślny sposób sortowania danych, nie ma potrzeby stosowania słowa kluczowego "rosnąco".

Jak korzystać z metody LINQ OrderBy

Sortowanie danych w porządku rosnącym

W języku C# istnieją dwa sposoby zastosowania tej metody: poprzez składnię metody lub składnię zapytania. Użyjemy składni metody, ponieważ jest ona prosta:

var sortedCollection = collection.OrderBy(item => item.OrderByProperty);
var sortedCollection = collection.OrderBy(item => item.OrderByProperty);
Dim sortedCollection = collection.OrderBy(Function(item) item.OrderByProperty)
$vbLabelText   $csharpLabel

W tym przypadku collection to zbiór źródłowy IEnumerable, który chcesz posortować, a OrderByProperty to właściwość lub wyrażenie, według którego chcesz uporządkować elementy. Wyrażenie lambda w OrderBy określa kryterium sortowania.

Sortowanie danych w porządku malejącym

Aby posortować w porządku malejącym, można użyć metody OrderByDescending, korzystając ze składni opartej na metodach:

var sortedCollectionDesc = collection.OrderByDescending(item => item.OrderByProperty);
var sortedCollectionDesc = collection.OrderByDescending(item => item.OrderByProperty);
Dim sortedCollectionDesc = collection.OrderByDescending(Function(item) item.OrderByProperty)
$vbLabelText   $csharpLabel

Sortowanie danych według wielu kryteriów

W rzeczywistych sytuacjach często trzeba sortować zbiór danych na podstawie wielu kryteriów. OrderBy umożliwia to poprzez łańcuchowanie wielu wywołań ThenBy lub ThenByDescending:

var multiSortedCollection = collection
    .OrderBy(item => item.OrderByProperty1)
    .ThenByDescending(item => item.OrderByProperty2);
var multiSortedCollection = collection
    .OrderBy(item => item.OrderByProperty1)
    .ThenByDescending(item => item.OrderByProperty2);
Dim multiSortedCollection = collection.OrderBy(Function(item) item.OrderByProperty1).ThenByDescending(Function(item) item.OrderByProperty2)
$vbLabelText   $csharpLabel

W tym przykładzie zbiór jest najpierw sortowany według OrderByProperty1 w porządku rosnącym. Następnie elementy o tej samej wartości OrderByProperty1 są sortowane według OrderByProperty2 w porządku malejącym.

Niestandardowe komparatory

W przypadku bardziej złożonych wymagań dotyczących sortowania można użyć niestandardowych komparatorów. Metoda OrderBy pozwala na przekazanie implementacji IComparer<t>, jak pokazano w poniższym przykładzie:

var customSortedCollection = collection.OrderBy(item => item.Property, new CustomComparer());
var customSortedCollection = collection.OrderBy(item => item.Property, new CustomComparer());
Dim customSortedCollection = collection.OrderBy(Function(item) item.Property, New CustomComparer())
$vbLabelText   $csharpLabel

W tym przypadku CustomComparer jest klasą implementującą interfejs IComparer<t>, zapewniającą niestandardową logikę porównywania elementów.

Praktyczny przykład: sortowanie obiektów

Sortowanie listy liczb całkowitych

using System;
using System.Linq;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
        List<int> numbers = new List<int> { 5, 2, 8, 1, 7 };
        var sortedNumbers = numbers.OrderBy(num => num);
        Console.WriteLine("Sorted Numbers:");
        foreach (var number in sortedNumbers)
        {
            Console.WriteLine(number);
        }
    }
}
using System;
using System.Linq;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
        List<int> numbers = new List<int> { 5, 2, 8, 1, 7 };
        var sortedNumbers = numbers.OrderBy(num => num);
        Console.WriteLine("Sorted Numbers:");
        foreach (var number in sortedNumbers)
        {
            Console.WriteLine(number);
        }
    }
}
Imports System
Imports System.Linq
Imports System.Collections.Generic

Friend Class Program
	Shared Sub Main()
		Dim numbers As New List(Of Integer) From {5, 2, 8, 1, 7}
		Dim sortedNumbers = numbers.OrderBy(Function(num) num)
		Console.WriteLine("Sorted Numbers:")
		For Each number In sortedNumbers
			Console.WriteLine(number)
		Next number
	End Sub
End Class
$vbLabelText   $csharpLabel

W tym przykładzie lista liczb całkowitych jest sortowana w porządku rosnącym przy użyciu OrderBy.

Sortowanie listy ciągów znaków

using System;
using System.Linq;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
        List<string> names = new List<string> { "Alice", "Charlie", "Bob", "David" };
        var sortedNames = names.OrderBy(name => name);
        Console.WriteLine("Sorted Names:");
        foreach (var name in sortedNames)
        {
            Console.WriteLine(name);
        }
    }
}
using System;
using System.Linq;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
        List<string> names = new List<string> { "Alice", "Charlie", "Bob", "David" };
        var sortedNames = names.OrderBy(name => name);
        Console.WriteLine("Sorted Names:");
        foreach (var name in sortedNames)
        {
            Console.WriteLine(name);
        }
    }
}
Imports System
Imports System.Linq
Imports System.Collections.Generic

Friend Class Program
	Shared Sub Main()
		Dim names As New List(Of String) From {"Alice", "Charlie", "Bob", "David"}
		Dim sortedNames = names.OrderBy(Function(name) name)
		Console.WriteLine("Sorted Names:")
		For Each name In sortedNames
			Console.WriteLine(name)
		Next name
	End Sub
End Class
$vbLabelText   $csharpLabel

Ten przykład pokazuje sortowanie listy ciągów znaków w porządku alfabetycznym rosnącym.

Sortowanie listy obiektów niestandardowych

using System;
using System.Linq;
using System.Collections.Generic;

class Person
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public int Age { get; set; }
}

class Program
{
    static void Main()
    {
        List<Person> people = new List<Person>
        {
            new Person { FirstName = "John", LastName = "Doe", Age = 30 },
            new Person { FirstName = "Alice", LastName = "Smith", Age = 25 },
            new Person { FirstName = "Bob", LastName = "Johnson", Age = 35 }
        };
        var sortedPeople = people.OrderBy(person => person.Age);
        Console.WriteLine("Sorted People by Age:");
        foreach (var person in sortedPeople)
        {
            Console.WriteLine($"{person.FirstName} {person.LastName}, Age: {person.Age}");
        }
    }
}
using System;
using System.Linq;
using System.Collections.Generic;

class Person
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public int Age { get; set; }
}

class Program
{
    static void Main()
    {
        List<Person> people = new List<Person>
        {
            new Person { FirstName = "John", LastName = "Doe", Age = 30 },
            new Person { FirstName = "Alice", LastName = "Smith", Age = 25 },
            new Person { FirstName = "Bob", LastName = "Johnson", Age = 35 }
        };
        var sortedPeople = people.OrderBy(person => person.Age);
        Console.WriteLine("Sorted People by Age:");
        foreach (var person in sortedPeople)
        {
            Console.WriteLine($"{person.FirstName} {person.LastName}, Age: {person.Age}");
        }
    }
}
Imports System
Imports System.Linq
Imports System.Collections.Generic

Friend Class Person
	Public Property FirstName() As String
	Public Property LastName() As String
	Public Property Age() As Integer
End Class

Friend Class Program
	Shared Sub Main()
		Dim people As New List(Of Person) From {
			New Person With {
				.FirstName = "John",
				.LastName = "Doe",
				.Age = 30
			},
			New Person With {
				.FirstName = "Alice",
				.LastName = "Smith",
				.Age = 25
			},
			New Person With {
				.FirstName = "Bob",
				.LastName = "Johnson",
				.Age = 35
			}
		}
		Dim sortedPeople = people.OrderBy(Function(person) person.Age)
		Console.WriteLine("Sorted People by Age:")
		For Each person In sortedPeople
			Console.WriteLine($"{person.FirstName} {person.LastName}, Age: {person.Age}")
		Next person
	End Sub
End Class
$vbLabelText   $csharpLabel

W tym przykładzie lista niestandardowych obiektów Person jest sortowana według właściwości Age w porządku rosnącym.

W konsoli widoczny jest następujący wynik:

C# Orderby (jak to działa dla programistów): Rysunek 1 – Wynik działania poprzedniego kodu sortującego obiekty niestandardowe

Obsługa porównań ciągów znaków

W przypadku właściwości ciągów znaków warto zapewnić sortowanie bez uwzględniania wielkości liter:

var sortedPeopleByName = people.OrderBy(person => person.LastName, StringComparer.OrdinalIgnoreCase);
var sortedPeopleByName = people.OrderBy(person => person.LastName, StringComparer.OrdinalIgnoreCase);
Dim sortedPeopleByName = people.OrderBy(Function(person) person.LastName, StringComparer.OrdinalIgnoreCase)
$vbLabelText   $csharpLabel

W tym przykładzie użyto StringComparer.OrdinalIgnoreCase do sortowania bez uwzględniania wielkości liter na podstawie właściwości LastName.

Kwestie związane z wydajnością

Chociaż LINQ zapewnia zwięzły sposób sortowania kolekcji, należy koniecznie wziąć pod uwagę wpływ na wydajność, zwłaszcza w przypadku dużych zbiorów danych. W scenariuszach, w których kluczowa jest wydajność, warto rozważyć alternatywne rozwiązania, takie jak sortowanie na miejscu przy użyciu metody List<t>.Sort.

Przedstawiamy IronPDF

Odkryj możliwości IronPDF w bibliotece C# PDF firmy Iron Software, która pomaga odczytywać i generować dokumenty PDF. Może z łatwością konwertować sformatowane dokumenty zawierające informacje o stylach do formatu PDF. IronPDF może generować pliki PDF na podstawie ciągów znaków HTML lub pobierać kod HTML z adresu URL, a następnie generować pliki PDF.

IronPDF wyróżnia się w zakresie konwersji HTML do PDF, zachowując wszystkie układy i style. Może generować pliki PDF z różnych treści internetowych, takich jak raporty, faktury i dokumentacja. Narzędzie obsługuje pliki HTML, adresy URL i ciągi znaków HTML w celu tworzenia plików 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

Instalacja

IronPDF można zainstalować za pomocą konsoli menedżera pakietów NuGet lub menedżera pakietów Visual Studio.

Install-Package IronPdf

Można również zainstalować IronPDF za pomocą menedżera pakietów NuGet, wpisując "ironpdf" w pasku wyszukiwania.

C# Orderby (jak to działa dla programistów): Rysunek 2 — Instalacja IronPDF za pomocą menedżera pakietów NuGet

Generowanie pliku PDF za pomocą IronPDF

Poniżej znajduje się kod służący do generowania raportu PDF przy użyciu ciągu znaków HTML i generatora IronPDF:

// See https://aka.ms/new-console-template for more information

using IronPdf;
using System;
using System.Collections.Generic;
using System.Linq;

class Person
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public int Age { get; set; }
}

class Program
{
    static void Main()
    {
        List<Person> people = new List<Person>
        {
            new Person { FirstName = "John", LastName = "Doe", Age = 30 },
            new Person { FirstName = "Alice", LastName = "Smith", Age = 25 },
            new Person { FirstName = "Bob", LastName = "Johnson", Age = 35 }
        };

        // Sort people by age
        var sortedPeople = people.OrderBy(person => person.Age);

        string name = "Sam";
        var count = people.Count;

        // Generate an HTML string
        string content = $@"<!DOCTYPE html>
<html>
<body>
<h1>Hello, {name}!</h1>
<p>You have {count} people sorted by Age.</p>
" + string.Join("\n", sortedPeople.Select(person => $"{person.FirstName} {person.LastName}, Age: {person.Age}"))
+ @"
</body>
</html>";

        // Create a new PDF document and save it
        var pdfDocument = new ChromePdfRenderer();
        pdfDocument.RenderHtmlAsPdf(content).SaveAs("personByAge.pdf");
    }
}
// See https://aka.ms/new-console-template for more information

using IronPdf;
using System;
using System.Collections.Generic;
using System.Linq;

class Person
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public int Age { get; set; }
}

class Program
{
    static void Main()
    {
        List<Person> people = new List<Person>
        {
            new Person { FirstName = "John", LastName = "Doe", Age = 30 },
            new Person { FirstName = "Alice", LastName = "Smith", Age = 25 },
            new Person { FirstName = "Bob", LastName = "Johnson", Age = 35 }
        };

        // Sort people by age
        var sortedPeople = people.OrderBy(person => person.Age);

        string name = "Sam";
        var count = people.Count;

        // Generate an HTML string
        string content = $@"<!DOCTYPE html>
<html>
<body>
<h1>Hello, {name}!</h1>
<p>You have {count} people sorted by Age.</p>
" + string.Join("\n", sortedPeople.Select(person => $"{person.FirstName} {person.LastName}, Age: {person.Age}"))
+ @"
</body>
</html>";

        // Create a new PDF document and save it
        var pdfDocument = new ChromePdfRenderer();
        pdfDocument.RenderHtmlAsPdf(content).SaveAs("personByAge.pdf");
    }
}
' See https://aka.ms/new-console-template for more information

Imports Microsoft.VisualBasic
Imports IronPdf
Imports System
Imports System.Collections.Generic
Imports System.Linq

Friend Class Person
	Public Property FirstName() As String
	Public Property LastName() As String
	Public Property Age() As Integer
End Class

Friend Class Program
	Shared Sub Main()
		Dim people As New List(Of Person) From {
			New Person With {
				.FirstName = "John",
				.LastName = "Doe",
				.Age = 30
			},
			New Person With {
				.FirstName = "Alice",
				.LastName = "Smith",
				.Age = 25
			},
			New Person With {
				.FirstName = "Bob",
				.LastName = "Johnson",
				.Age = 35
			}
		}

		' Sort people by age
		Dim sortedPeople = people.OrderBy(Function(person) person.Age)

		Dim name As String = "Sam"
		Dim count = people.Count

		' Generate an HTML string
		Dim content As String = $"<!DOCTYPE html>
<html>
<body>
<h1>Hello, {name}!</h1>
<p>You have {count} people sorted by Age.</p>
" & String.Join(vbLf, sortedPeople.Select(Function(person) $"{person.FirstName} {person.LastName}, Age: {person.Age}")) & "
</body>
</html>"

		' Create a new PDF document and save it
		Dim pdfDocument = New ChromePdfRenderer()
		pdfDocument.RenderHtmlAsPdf(content).SaveAs("personByAge.pdf")
	End Sub
End Class
$vbLabelText   $csharpLabel

W tym miejscu najpierw generujemy ciąg HTML z sortedPeople, który jest posortowany w porządku rosnącym i zawiera wszystkie formatowania wymagane dla raportów. Następnie używamy IronPDF do wygenerowania dokumentu PDF. Używamy metody RenderHtmlAsPdf do konwersji ciągu HTML na dokument PDF.

Wynik

W pliku PDF dostępny jest następujący wynik:

C# Orderby (jak to działa dla programistów): Rysunek 3 – Plik PDF wygenerowany na podstawie poprzedniego kodu

Licencjonowanie (dostępna bezpłatna wersja próbna)

Klucz próbny można uzyskać na stronie Licencji Trial IronPDF. Ten klucz należy umieścić w pliku appsettings.json.

"IronPdf.LicenseKey": "your license key"

Podaj swój adres e-mail, aby otrzymać Licencję Trial.

Wnioski

Metoda OrderBy w języku C# jest wszechstronnym narzędziem do sortowania kolekcji na podstawie różnych kryteriów. Niezależnie od tego, czy sortujesz w porządku rosnącym czy malejącym, według jednego lub wielu kryteriów, czy też używasz niestandardowych komparatorów, opanowanie funkcji OrderBy może znacznie poprawić przejrzystość i wydajność Twojego kodu.

W połączeniu z biblioteką IronPDF do generowania dokumentów PDF stanowi to doskonałe rozwiązanie do tworzenia pięknie sformatowanych i uporządkowanych zbiorów w postaci dokumentów.

Często Zadawane Pytania

Jak działa metoda OrderBy w C#?

Metoda OrderBy w C#, będąca częścią biblioteki LINQ, sortuje elementy kolekcji w porządku rosnącym. Może być używana zarówno ze składnią metod jak i zapytań, i jest na tyle uniwersalna, że obsługuje liczby całkowite, ciągi znaków i obiekty niestandardowe.

Jak mogę posortować dane w kolejności malejącej w C#?

Aby posortować dane w kolejności malejącej w C#, można użyć metody OrderByDescending. Jest to część biblioteki LINQ i uzupełnia OrderBy dla różnych potrzeb sortowania.

Czy jest możliwość sortowania według wielu pól w C#?

Tak, w C# można sortować według wielu pól, używając OrderBy w połączeniu z ThenBy lub ThenByDescending. Pozwala to na skomplikowane kryteria sortowania, umożliwiając programistom sortowanie kolekcji na podstawie wielu atrybutów.

Czym jest porównywarka niestandardowa i jak się jej używa w sortowaniu w C#?

Porównywarka niestandardowa w C# to implementacja interfejsu IComparer, która dostarcza niestandardowej logiki do porównywania elementów podczas sortowania. Jest to przydatne do sortowania złożonych obiektów lub gdy domyślne zachowanie sortowania nie odpowiada specyficznym wymaganiom.

Jak mogę użyć IronPDF do generowania plików PDF w C#?

Można użyć IronPDF w C# do generowania plików PDF z ciągów HTML, plików lub nawet adresów URL stron. IronPDF utrzymuje układ i styl oryginalnej treści, co czyni go idealnym do tworzenia profesjonalnych dokumentów, takich jak raporty czy faktury.

Jakie są kroki instalacji IronPDF w projekcie C#?

IronPDF można zainstalować w projekcie C# przy użyciu menedżera pakietów NuGet. Możesz wykonać komendę dotnet add package IronPdf w konsoli lub użyć menedżera pakietów w Visual Studio, aby dodać go do projektu.

Jak IronPDF integruje się z C# OrderBy do generowania plików PDF?

IronPDF można zintegrować z C# OrderBy, aby tworzyć posortowane i sformatowane raporty PDF. Poprzez sortowanie kolekcji danych przy użyciu OrderBy przed renderowaniem, zapewniasz, że wyjście PDF jest zorganizowane zgodnie z kryteriami sortowania.

Czy IronPDF może konwertować adres URL strony internetowej na PDF?

Tak, IronPDF może konwertować treści webowe z adresu URL do dokumentu PDF. Zachowuje oryginalny układ i style strony, co czyni go odpowiednim do archiwizacji stron internetowych lub tworzenia wersji do druku.

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