HOWTO · Csharp
C# 中按字母順序排序列表
本文介紹如何在 C# 中按字母順序對列表進行排序。
本頁內容
若要在 C# 中依字母順序排序清單,請對 List<T> 呼叫 Sort()。排序字串時,會使用清單的預設比較器排列值;排序物件清單時,則提供讀取指定排序屬性的比較方式。Sort() 會直接重新排列現有清單,因此之後可以列印同一份清單。
依字母順序排序字串清單
List<string> 已有預設比較器,因此排序字串時不需要另外撰寫比較函式。比較器遵循目前文化特性的字串比較規則;對一般英文單字而言,下方範例會依字母順序排列名稱。文化規則可能影響重音字元或其他具有文化差異的字元之間的相對順序,因此若應用程式需要不受文化特性影響的排序,請使用明確指定的比較方式。
執行以下範例:
本節中的程式碼以及顯示的標籤或輸出仍為英文。
using System;
using System.Collections.Generic;
class Program
{
static void Main()
{
var words = new List<string> { "Pear", "Apple", "Orange" };
words.Sort();
foreach (string word in words)
{
Console.WriteLine(word);
}
}
}
列印出的名稱依序為 Apple、Orange 和 Pear,每個名稱各占一行。這次呼叫會就地排序 words:變數仍指向同一份清單,只是清單中的順序已改變。若後續程式碼需要使用排序後的序列,這種方式很方便。如果還需要保留原始順序,請先複製清單,再呼叫 Sort()。
依指定屬性排序物件
若要排序物件,請在傳給 Sort() 的比較委派中選擇一個屬性。委派會收到清單中的兩個元素;若第一個元素應排在前面,就回傳負值;若兩者的排序鍵相同,就回傳零;若第一個元素應排在後面,則回傳正值。此處的 StringComparison.Ordinal 會依據 UTF-16 程式碼單位,以一致的序位順序排列名稱,而不套用目前文化特性的語言排序規則。如果排序結果是要顯示給特定讀者,請改用符合其文化特性的比較器。
本節中的程式碼以及顯示的標籤或輸出仍為英文。
using System;
using System.Collections.Generic;
class Person
{
public string Name { get; }
public Person(string name) => Name = name;
}
class Program
{
static void Main()
{
var people = new List<Person>
{
new Person("Maya"),
new Person("Alex"),
new Person("Jordan")
};
people.Sort((left, right) =>
string.Compare(left.Name, right.Name, StringComparison.Ordinal));
foreach (Person person in people)
{
Console.WriteLine(person.Name);
}
}
}
傳給委派的兩個值都是 Person 物件,但比較時只使用它們的 Name 值。若要排序其他類型的物件,請將 Name 換成決定排序順序的屬性,並使用適合該屬性型別的比較器。如果兩個人的姓名相同,這個比較方式會視為相等;只有在任務需要次要排序條件時,才加入第二排序鍵。清單仍是 List<Person>,其中的元素會直接重新排列,而不會複製到新的集合中。
列印排序後的清單
排序前後都列印值,就能查看順序如何改變。這個完整範例從三個名稱開始,先輸出原始順序,再排序同一份清單,最後輸出新的順序。foreach 會依清單目前的順序逐一處理元素;它本身不會執行排序。改變順序的是 Sort() 呼叫。程式碼中的 Before sorting: 和 After sorting: 標籤維持英文,分別表示排序前與排序後。
本節中的程式碼以及顯示的標籤或輸出仍為英文。
using System;
using System.Collections.Generic;
class Program
{
static void Main()
{
var names = new List<string> { "Mina", "Eli", "Noah" };
Console.WriteLine("Before sorting:");
foreach (string name in names)
{
Console.WriteLine(name);
}
names.Sort();
Console.WriteLine("After sorting:");
foreach (string name in names)
{
Console.WriteLine(name);
}
}
}
第一個迴圈依插入順序顯示名稱。呼叫 names.Sort() 後,第二個迴圈會依預設字串比較器選出的順序逐一處理清單。若要在主控台應用程式中查看結果,請保留 Console.WriteLine 呼叫;在其他程式中,也可以直接將排序後的清單傳給下一個操作。這些範例只使用理解並執行兩種排序方式所需的匯入、屬性與設定。