Lệnh LINQ Bằng nhiều hơn một trường


82

Tôi có một danh sách mà tôi cần sắp xếp theo hai trường. Tôi đã thử sử dụng OrderBy trong LINQ nhưng điều đó chỉ cho phép tôi chỉ định một trường. Tôi đang tìm danh sách được sắp xếp theo trường đầu tiên và sau đó, nếu có bất kỳ bản sao nào trong trường đầu tiên, hãy sắp xếp theo trường thứ hai.

Ví dụ, tôi muốn kết quả trông như thế này (sắp xếp theo họ rồi đến tên).

  • Adams, John
  • Smith, James
  • Smith, Peter
  • Thompson, Fred

Tôi đã thấy rằng bạn có thể sử dụng cú pháp như SQL để thực hiện điều này nhưng tôi đang tìm cách thực hiện điều đó với phương thức OrderBy.

IList<Person> listOfPeople = /*The list is filled somehow.*/
IEnumerable<Person> sortedListOfPeople = listOfPeople.OrderBy(aPerson => aPerson.LastName, aPerson.FirstName); //This doesn't work.

Câu trả lời:


169

Bạn cần sử dụng ThenBy:

listOfPeople.OrderBy(person => person.LastName)
            .ThenBy(person => person.FirstName)

1
Giải thích đầy đủ được liệt kê ở đây: weblogs.asp.net/zeeshanhirani/archive/2008/04/16/…
DigitalNomad

Đây là Lambda .. Giải pháp LINQ cần @svick có nó trong LINQ.
Ravi Ram

5
Tôi không chắc bạn muốn nói gì. Cú pháp truy vấn chỉ là đường cho cú pháp phương thức ở trên; cả hai đều là "LINQ". Xem msdn.microsoft.com/en-us/library/vstudio/bb397947.aspx Và nếu bạn đọc câu hỏi, anh ấy đặc biệt yêu cầu phiên bản cú pháp phương pháp.
tzaman

24

Nếu bạn muốn sử dụng cú pháp phương pháp, hãy sử dụng ThenBy(), như những người khác đã đề xuất:

listOfPeople.OrderBy(person => person.LastName)
            .ThenBy(person => person.FirstName)

Trong cú pháp truy vấn, điều tương tự có thể được thực hiện khá nhiều theo cách bạn muốn: hai khóa sắp xếp được phân tách bằng dấu phẩy:

from person in listOfPeople
orderby person.LastName, person.FirstName
select person

Đoạn mã trên sẽ thực sự được biên dịch thành mã sử dụng OrderBy()ThenBy(), như trong ví dụ đầu tiên.

Ngoài ra, nếu bạn muốn có OrderBy()hai (hoặc nhiều) khóa sắp xếp, bạn chắc chắn có thể viết nó như một phương thức mở rộng trên IEnumerable<T>các cuộc gọi nội bộ đó OrderBy()ThenBy().


3

Các trường tiếp theo của bạn phải được sắp xếp bằng cách sử dụng phương thức ThenBy ()



2
var sortedListOfPeople = listOfPeople.OrderBy(aPerson => aPerson.LastName).ThenBy(a => aPerson.FirstName);

2

Cách sắp xếp một danh sách với nhiều người nộp hơn như sau:

var soterdList = initialList.OrderBy(x => x.Priority).
                                    ThenBy(x => x.ArrivalDate).
                                    ThenBy(x => x.ShipDate);

Bạn có thể thêm các trường khác với clasole "ThenBy"

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.