2010-06-24 39 views
6

Nói rằng tôi có một danh sách các đối tượng Person:Làm thế nào để sắp xếp danh sách các đối tượng của một thành viên cụ thể?

class person 
{ 
    int id; 
    string FirstName; 
    string LastName; 
} 

Làm thế nào tôi có thể sắp xếp danh sách này bởi các thành viên LastName?

List<Person> myPeople = GetMyPeople(); 
myPeople.Sort(/* what goes here? */); 
+0

trùng lặp: http: // stackoverflow.com/questions/3062373/how-can-i-sort-generic-list-with-linq – brainimus

Trả lời

12

Dưới C# 3.0, bạn có thể sử dụng câu lệnh LINQ sau:

var sortedEnumerable = myPeople.OrderBy(p => p.LastName); 
+0

Ngắn và ngọt ngào, cảm ơn! –

1

Một tùy chỉnh IComparer<person>. Nếu bạn đang sử dụng C# 3.0 và .net3.5, hãy xem các phương pháp LINQ, đặc biệt là IEnumerable<T>.OrderBy().

2

Một lựa chọn là để viết một Comparer:

class LastNameComparer : IComparer<Person> 
{ 
    public int Compare(Person x, Person y) 
    { 
     return String.Compare(x.LastName, y.LastName); 
    } 
} 

Một sau đó

myPeople.Sort(new LastNameComparer()); 

Person cũng có thể thực hiện IComparable<Person>, trong trường hợp này myPeople.Sort() sẽ đủ. Tuy nhiên, bạn có thể muốn sắp xếp theo các thuộc tính khác ở những nơi khác, vì vậy đây không phải là phương pháp chung; nếu bạn muốn sắp xếp theo ID trên một báo cáo khác, bạn có thể viết IComparer khác, nhưng bạn chỉ có thể có một phương thức IComparable<Person>.CompareTo(Person other).

Nếu bạn đang cảm thấy lười biếng, hoặc chắc chắn rằng bạn sẽ không sử dụng nó một lần nữa, bạn cũng có thể sử dụng một lambda:

myPeople.Sort((p1, p2) => String.Compare(p1.LastName, p2.LastName)); 
+0

Câu trả lời hay! :) –

3

Như những người khác đã gợi ý, bạn có thể sử dụng một tùy chỉnh IComparer phương pháp để sắp xếp của bạn danh sách. Nếu bạn chỉ làm việc đó một lần, cách dễ nhất là sử dụng một phương pháp vô danh như ví dụ:

List<Person> myPeople = GetMyPeople(); 
myPeople.Sort(delegate(Person one, Person two) 
{ 
    return one.LastName.CompareTo(two.LastName); 
}); 

Ngoài ra, bạn có thể thực hiện IComparable trên lớp Person của bạn, do đó lớp biết làm thế nào để sắp xếp tự:

class Person : IComparable<Person> 
{ 
    int id; 
    string FirstName; 
    string LastName; 

    public int CompareTo(Person other) 
    { 
     return LastName.CompareTo(other.LastName); 
    } 
} 
14

List<T>.Sort sẽ sắp xếp danh sách tại chỗ. Nếu đó là những gì bạn muốn, ngọt: sử dụng the overload that takes a Comparison<T> delegate:

List<Person> myPeople = GetMyPeople(); 
myPeople.Sort((x, y) => x.LastName.CompareTo(y.LastName)); 

Nếu bạn không muốn thay đổi danh sách thực tế nhưng muốn liệt kê trên nội dung của nó theo một thứ tự sắp xếp, sau đó, như những người khác đã gợi ý, sử dụng the LINQ extension method OrderBy (.NET 3.5 trở lên) thay thế. Phương pháp này có thể chọn một bộ chọn và đơn hàng Func<T, TKey> đơn giản bằng các phím mà bộ chọn này ... bạn biết, chọn.

List<Person> myPeople = GetMyPeople(); 
var orderedByLastName = myPeople.OrderBy(p => p.LastName); 
+0

Câu trả lời hay nhất cho đến nay. Thật khó chịu khi tạo một IComparer cho mọi Thuộc tính bạn muốn sắp xếp. –

+0

Ngoài ra còn có một phương thức OrderByDescending trong LINQ nếu đó là thứ tự bạn cần. – brainimus

+0

+1, bạn sẽ nhận được giải thưởng Á hậu đầu tiên. –

0

Không có gì cần phải đi vào trong "Sắp xếp" gọi phương thức của bạn nếu lớp học của bạn thực hiện IComparable.

Kiểm tra điều này link để biết chi tiết.

Code:

class person : IComparable<person> 
{ 
    int id; 
    string FirstName; 
    string LastName; 

public int CompareTo(person other) 
    { 
     //If you want to sort on FirstName 
     return FirstName.CompareTo(other.FirstName); 
    } 


} 
1

ví dụ về ICompare

/// <summary> 
    /// Sort class on LastName Descending Order 
    /// </summary> 
    private class PersonLastNameDescending : IComparer<Person> 
    { 
     public int Compare(Person aX, Person aY) 
     { 
     return aY.LastName.CompareTo(aX.LastName); 
     } // end Compare(...) 
    } // end inner class PersonLastNameDescending 

    MyPeople.Sort(new PersonLastNameDescending()); 
Các vấn đề liên quan