C#關於List<T>的自定義排序學習筆記

海一粟發表於2024-06-10

Person 類定義

public class Person  
{  
    public string Name { get; set; }  
    public int Age { get; set; }  
  
    // 如果需要的話,可以在這裡實現 IComparable<Person> 介面  
    // 但為了示例的簡潔性,我們在這裡不實現它  
}

對 List 進行自定義排序的方法

在C#中,對List進行自定義排序通常有以下幾種方法:

1. 實現 IComparer 介面

建立一個類來實現IComparer介面,並在其中定義比較邏輯。然後將這個類的例項作為引數傳遞給List.Sort方法。

public class PersonAgeComparer : IComparer<Person>  
{  
    public int Compare(Person x, Person y)  
    {  
        return x.Age.CompareTo(y.Age);  
    }  
}  

// 使用方法  
List<Person> people = ... // 初始化Person列表  
people.Sort(new PersonAgeComparer());

2. 使用 Lambda 表示式或匿名方法

在呼叫Sort方法時直接傳遞一個Lambda表示式或匿名方法來定義比較邏輯。

// 使用Lambda表示式  
people.Sort((p1, p2) => p1.Age.CompareTo(p2.Age));  
  
// 使用匿名方法(較少使用,因為Lambda更簡潔)  
people.Sort(delegate(Person p1, Person p2) { return p1.Age.CompareTo(p2.Age); });

3. 在類內部實現 IComparable 介面

如果排序邏輯是類固有的,可以在類內部實現IComparable介面。這樣,類的例項就可以直接使用預設的Sort方法(不帶引數)進行排序。

public class Person : IComparable<Person>  
{  
    // ... 其他屬性和方法 ...  
  
    public int CompareTo(Person other)  
    {  
        return this.Age.CompareTo(other.Age);  
    }  
}  
  
// 使用方法(不需要傳遞比較器)  
people.Sort(); // 假設Person類已經實現了IComparable<Person>介面

4. 使用 LINQ 的 OrderBy 或 ThenBy 方法(不修改原始列表)

如果你不想修改原始列表,而是想建立一個新的已排序列表,可以使用LINQ的OrderBy和ThenBy方法。

var sortedPeople = people.OrderBy(p => p.Age).ToList();  
var sortedPeopleByMultipleFields = people.OrderBy(p => p.LastName).ThenBy(p => p.FirstName).ToList(); // 假設Person類有LastName屬性

總結

以上四種方法都可以用來對List進行自定義排序。選擇哪種方法取決於你的具體需求和偏好。在大多數情況下,Lambda表示式和LINQ方法是最常用和簡潔的方式來實現自定義排序。如果你需要重複使用相同的排序邏輯,並且它是類固有的,那麼在類內部實現IComparable介面可能是更好的選擇。

相關文章