2009-12-29 34 views
8

tôi có một danh sách của các tầng lớp trong bộ sưu tập của tôi nhưLàm thế nào để sắp xếp một bộ sưu tập danh sách các lớp với các thuộc tính trong chúng?

List<MyClass> test = new List<MyClass>(); 

Trong lớp học của tôi, tôi chỉ có một số đặc tính

public string id {get; set;} 
public DateTime date {get; set;} 

Bây giờ tôi làm cho các lớp này bằng cách nhận một số truy vấn từ 2 bảng cơ sở dữ liệu khác nhau. Sau đó tôi lấy 2 kết quả đó từ các bảng cơ sở dữ liệu và sử dụng vòng lặp foreach tôi tạo một đối tượng MyClass mới và dán nó vào bộ sưu tập "test" của tôi.

Bây giờ, một khi tất cả các lớp này được đưa vào bộ sưu tập danh sách. Tôi muốn sắp xếp chúng và sắp xếp các lớp theo thuộc tính "date".

Tôi làm cách nào để thực hiện việc này? Tôi không thể đặt hàng ngay khi tôi lấy chúng từ cơ sở dữ liệu vì tôi lấy chúng từ 2 bảng cơ sở dữ liệu khác nhau và đặt chúng riêng biệt sẽ chỉ làm cho nó được đặt hàng cho mỗi phần nhưng bảng có thể có 12/12/2009 và có thể bảng hai. Vì vậy, họ cần phải được đặt hàng cùng nhau.

Tôi có thể sử dụng LINQ hoặc thứ gì đó để đặt hàng?

Cảm ơn

Trả lời

20

Làm thế nào về:

list.Sort((x,y) => DateTime.Compare(x.date, y.date)); 

mà sắp xếp các danh sách hiện có, hoặc:

var sorted = list.OrderBy(x=>x.date).ToList(); 

tạo danh sách thứ hai.

+0

Ya như tôi đã đề cập dưới đây tôi đã cố gắng làm theo cách thứ hai trước khi tôi đăng nhưng không sử dụng. ToList() Vì vậy, orderBy luôn tạo một danh sách mới trong khi sắp xếp không? – chobo2

+1

Có. List.Sort sắp xếp danh sách tại chỗ, vì vậy danh sách gốc bị thay đổi. LINQ (phương pháp thứ hai) tạo ra một enumerable mới. Bằng cách thêm "ToList", bạn chuyển nó thành Danh sách thay vì IEnumerable . Nếu bạn chỉ sử dụng kết quả trong vòng lặp foreach, bạn có thể để phương thức "ToList()" tắt. –

+0

(những gì ông nói ...) –

2

Khi bạn có các lớp học của bạn trong danh sách của bạn, và danh sách được hoàn tất:

List<MyClass> testList = new List<MyClass>(); 
// populate the list... 

var orderedList = testList.OrderBy(x => x.date).ToList(); 
+0

Ah tôi đã cố gắng nhưng không đặt .ToList() phía sau nó. Tôi thấy một số người sử dụng chức năng so sánh mà mang lại bất kỳ lợi thế hay bất cứ điều gì? – chobo2

3

Nếu bạn muốn sắp xếp chúng tại chỗ, bạn có thể sử dụng List<T>.Sort:

test.Sort((l,r) => l.date.CompareTo(r.date)); 

Nếu bạn muốn sắp xếp chúng thành một tập kết quả mới, LINQ là rất tốt đẹp:

var sortedResults = from mc in test 
        order by mc.date 
        select mc; 
Các vấn đề liên quan