跳過到頁腳內容
.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);
Dim sortedCollection = collection.OrderBy(Function(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);
Dim sortedCollectionDesc = collection.OrderByDescending(Function(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);
Dim multiSortedCollection = collection.OrderBy(Function(item) item.OrderByProperty1).ThenByDescending(Function(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());
Dim customSortedCollection = collection.OrderBy(Function(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);
        }
    }
}
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

在這個例子中,整數列表按升序排列,使用 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);
        }
    }
}
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

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

自訂物件清單排序

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

在這個例子中,自訂 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);
Dim sortedPeopleByName = people.OrderBy(Function(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");
    }
}
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

安裝

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");
    }
}
' 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

首先,我們從 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 字串、文件甚至 Web URL 生成 PDF。IronPDF 保持原始內容的佈局和樣式,非常適合創建報告和發票等專業文檔。

在 C# 項目中安裝 IronPDF 的步驟是什麼?

IronPDF 可以使用 NuGet 套件管理器安裝到 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核心代碼庫的原始開發者,他自公司成立以來就塑造了公司的產品架構,並與CEO Cameron Rimington將公司轉型為服務NASA、Tesla以及全球政府機構的50多人公司。

Jacob擁有曼徹斯特大學土木工程一級榮譽學士學位(1998年–2001年)。他於1999年在倫敦開立首家軟體公司,並於2005年建立了他的第一個.NET組件,專注於解決Microsoft生態系統中的複雜問題。

他的旗艦作品IronPDF和Iron Suite .NET程式庫全球已獲得超過3000萬次NuGet安裝,他的基礎代碼不斷在全球各地驅動開發者工具。擁有25年以上的商業經驗和41年的編碼專業知識,Jacob仍然專注於推動企業級C#、Java和Python PDF技術的創新,同時指導下一代技術領導者。

鋼鐵支援團隊

我們每週 5 天,每天 24 小時在線上。
聊天
電子郵件
打電話給我