跳至頁尾內容
.NET 幫助

C# Orderby(開發者如何理解其工作原理)

排序是任何程式語言的基本操作,而 C# OrderBy 方法是在集合中排列元素的強大工具。 無論是使用陣列、清單或其他可枚舉的結構,瞭解如何利用 OrderBy 可以大幅提升程式碼的可讀性和功能。

本文稍後將介紹 Iron Software 的 IronPDF 函式庫,以及我們如何使用 LINQ OrderBy 方法和 IronPDF 來產生格式化和排序的 PDF。

什麼是 LINQ OrderBy 方法?

OrderBy 方法是 C# 中 LINQ(語言整合查詢)庫的一部分,專門用於以升序排列元素; 由於這是資料排序的預設方式,因此不需要升序關鍵字。

如何使用 LINQ OrderBy 方法

以升序排序資料

在 C# 中,有兩種方法可以應用此方法:透過方法語法或查詢語法。 我們將使用方法語法,因為它簡單直接:

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

這裡,collection 是您要排序的 IEnumerable 原始集合,而 OrderByProperty 則是您要藉以排序元素的屬性或表達式。 OrderBy 中的 lambda 表達式指定排序標準。

以降序排序資料

若要以降序排序,您可以使用 OrderByDescending 方法,使用基於方法的語法:

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

透過多重條件排序資料

在現實世界的情境中,您經常需要根據多項條件對一個集合進行排序。 OrderBy 可透過串接多個 ThenByThenByDescending 呼叫來達到此目的:

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

在這個範例中,集合首先以 OrderByProperty1 的升序排序。 然後,對於具有相同 OrderByProperty1 值的元素,會依 OrderByProperty2 的順序排序。

自訂比較器

對於更複雜的排序需求,您可以使用自訂的比較器。 OrderBy 方法允許您傳遞一個 IComparer<T> 實作,如以下範例所示:

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

在此,CustomComparer 是實作 IComparer<T> 介面的類別,提供比較元素的自訂邏輯。

實用範例:排序物件

整數清單排序

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

在這個範例中,一個整數清單使用 OrderBy 以升序排序。

排序字串清單

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

本範例示範按字母升序排序字串清單。

自訂物件清單排序

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}");
        }
    }
}
$vbLabelText   $csharpLabel

在這個範例中,自訂 Person 物件的清單根據 Age 屬性以升序排序。

在控制台中可以看到以下輸出:

C# Orderby (How It Works For Developers):圖 1 - 自訂物件排序前一段程式碼的輸出

處理字串比較

在處理字串屬性時,您可能要確保不區分大小寫排序:

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

此範例使用 StringComparer.OrdinalIgnoreCase 來根據 LastName 屬性執行大小寫不分的排序。

效能考量

雖然 LINQ 提供了簡潔的方式來排序集合,但必須考慮效能的影響,尤其是對於大型資料集。 對於效能關鍵的情境,您可以探索其他替代方法,例如使用 List<T>.Sort 方法就地排序。

介紹 IronPDF。

Iron Software 的 C# PDF 函式庫中發現 IronPDF 功能,它有助於讀取和產生 PDF 文件。 它可以將包含樣式資訊的格式化文件輕鬆轉換成 PDF。 IronPDF 可以從 HTML 字串產生 PDF,也可以從 URL 下載 HTML,然後產生 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");
    }
}
$vbLabelText   $csharpLabel

安裝

IronPdf 可使用 NuGet 套件管理員控制台 或 Visual Studio 套件管理員進行安裝。

Install-Package IronPdf

您也可以使用 NuGet Package Manager 安裝 IronPDF,方法是在搜尋列中搜尋"ironpdf"。

C# Orderby (How It Works For Developers):圖 2 - 透過 NuGet 套件管理員安裝 IronPDF

使用 IronPDF 生成 PDF.

以下是使用 HTML 字串和 IronPDF 生成器生成 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

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");
    }
}
$vbLabelText   $csharpLabel

在此,我們首先從 sortedPeople 產生一個 HTML 字串,該字串以升序排序,並包含報表所需的所有格式。 然後我們使用 IronPDF 來產生 PDF 文件。 我們使用 RenderHtmlAsPdf 方法將 HTML 字串轉換為 PDF 文件。

輸出

以下是 PDF 的輸出內容:

C# Orderby (How It Works For Developers):圖 3 - 從之前的程式碼輸出 PDF

授權(可免費試用)

可從 IronPDF Trial License 取得試用金鑰。 此 key 需要放在 appsettings.json 中。

"IronPdf.LicenseKey": "your license key"

提供您的電子郵件以取得試用授權。

結論

C# 中的 OrderBy 方法是根據各種條件對集合進行排序的通用工具。 無論您是以升序或降序、單一或多重條件排序,或是使用自訂的比較器,掌握 OrderBy 都能大幅提升程式碼的清晰度與效率。

再搭配 IronPDF 用於產生 PDF 文件的函式庫,就可以將格式精美且排序整齊的資料集產生為文件。

常見問題解答

C# 的 OrderBy 方法是如何運作的?

C# 的 OrderBy 方法是 LINQ 函式庫的一部分,用於依升序對集合中的元素進行排序。它既可以用於方法語法,也可以用於查詢語法,而且功能強大,可以處理整數、字串和自訂物件。

如何使用 C# 對資料進行降序排序?

在 C# 中,可以使用 OrderByDescending 方法按降序對資料進行排序。此方法是 LINQ 庫的一部分,與 OrderBy 方法互補,可滿足不同的排序需求。

C#中是否可以按多個欄位排序?

是的,在 C# 中,您可以使用 OrderBy 結合 ThenBy 或 ThenByDescending 來按多個欄位排序。這允許使用複雜的排序條件,使開發人員能夠根據多個屬性對集合進行排序。

什麼是自訂比較器?它在 C# 排序中是如何使用的?

C# 中的自訂比較器是 IComparer 介面的一種實作。此介面提供自訂邏輯,用於在排序過程中比較元素。這對於對複雜物件進行排序或預設排序行為無法滿足特定要求的情況非常有用。

如何使用 IronPDF 在 C# 中產生 PDF 檔案?

您可以使用 C# 中的 IronPDF 從 HTML 字串、文件甚至網頁 URL 產生 PDF 文件。 IronPDF 會保留原始內容的佈局和樣式,因此非常適合建立報告和發票等專業文件。

如何在 C# 專案中安裝 IronPDF?

可以使用 NuGet 套件管理器將 IronPDF 安裝到 C# 專案中。您可以在控制台中執行命令dotnet add package IronPdf ,或使用 Visual Studio 中的套件管理器將其新增至您的專案。

IronPDF 如何與 C# OrderBy 整合以產生 PDF?

IronPDF 可以與 C# 的 OrderBy 函數集成,用於建立排序和格式化的 PDF 報告。透過在渲染之前使用 OrderBy 對資料集合進行排序,您可以確保 PDF 輸出按照您的排序標準進行組織。

IronPDF能否將網頁URL轉換為PDF?

是的,IronPDF 可以將 URL 中的網頁內容轉換為 PDF 文件。它會保留網頁的原始佈局和樣式,因此非常適合用於網頁存檔或建立可列印版本。

Jacob Mellor,Team Iron 首席技術官
首席技術長

Jacob Mellor 是 Iron Software 的首席技術官,也是一位富有遠見的工程師,率先開發了 C# PDF 技術。作為 Iron Software 核心程式碼庫的最初開發者,他自公司成立之初便參與塑造了其產品架構,並與執行長 Cameron Rimington 一起將其發展成為一家擁有 50 多名員工、服務於 NASA、特斯拉和全球政府機構的公司。

Jacob 於 1998 年至 2001 年在曼徹斯特大學獲得土木工程一級榮譽學士學位。 1999 年,他在倫敦創辦了自己的第一家軟體公司;2005 年,他創建了自己的第一個 .NET 元件。此後,他專注於解決微軟生態系統中的複雜問題。

他的旗艦產品 IronPDF 和 IronSuite .NET 庫在全球 NuGet 上的安裝量已超過 3000 萬次,其基礎程式碼持續為全球開發者工具提供支援。憑藉 25 年的商業經驗和 41 年的程式設計專長,Jacob 始終致力於推動企業級 C#、Java 和 Python PDF 技術的創新,同時指導下一代技術領導者。