2009-12-29 9 views
8

Mam Lista klas w mojej kolekcji jakJak posortować listę klas klas zawierających właściwości?

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

w moich klasach Mam tylko pewne właściwości

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

Teraz robię tych klas dostając jakieś zapytania z 2 różnych tabel bazy danych. Następnie wybieram te 2 wyniki z tabel bazy danych i za pomocą pętli foreach tworzę nowy obiekt MyClass i umieszczam go w mojej kolekcji "testowej".

Teraz, gdy wszystkie te klasy zostaną umieszczone w kolekcji list. Chcę je uporządkować i uporządkować zajęcia według właściwości "date".

Jak mogę to zrobić? Nie mogę wtedy zamówić, gdy otrzymam je z bazy danych, ponieważ otrzymuję je z 2 różnych tabel bazy danych, a ich zamówienie osobno zamawiałoby tylko w każdej sekcji, ale tabela może mieć 12.12.2009, więc może tabela druga. Więc muszą być zamówione razem.

Więc czy mogę w jaki sposób użyć linq lub czegoś, aby je zamówić?

Dzięki

Odpowiedz

20

Jak o:

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

który sortuje istniejącej listy lub:

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

który tworzy drugą listę.

+0

Tak jak wspomniałem poniżej, próbowałem zrobić drugą drogę, zanim opublikowałem, ale nie używałem .ToList() Więc zlecenie zawsze tworzy nową listę, a sortowanie nie? – chobo2

+1

Tak. List.Sort sortuje listę w miejscu, więc oryginalna lista jest zmieniona. LINQ (druga metoda) tworzy nowe przeliczalne. Dodając "ToList", zamieniasz go na listę zamiast IEnumerable . Jeśli chcesz użyć wyników w pętli foreach, możesz wyłączyć metodę "ToList()". –

+0

(co on powiedział ...) –

2

Gdy masz swoje klasy na liście, a lista jest kompletna:

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

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

Ach ja próbowałem tego, ale nie wstawiłem .ToList(). Widziałem, jak niektórzy używają funkcji porównania, która przynosi jakieś korzyści czy coś? – chobo2

3

Jeśli chcesz uporządkować je na miejscu, można użyć List<T>.Sort:

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

Jeśli chcesz sortować je do nowego zestawu wyników, LINQ jest bardzo ładny:

var sortedResults = from mc in test 
        order by mc.date 
        select mc;