2009-06-09 9 views
7

Powiedz, że mam klasę Person z nazwami, wiekiem i właściwościami poziomu.C# Lista <> Zamówienie z 3 właściwościami .Net 2.0

wiem jak zamówić przez jedną z właściwości, z

 PersonList.Sort(delegate(Person p1, Person p2) { 
      return p1.Name.CompareTo(p2.Name); 
     }); 

Ale jak mogę zamówić z imienia, wieku i poziomu.

equivalente zdania sql: ORDER BY nazwisko, wiek, poziom

Dziękuję

+0

Czy masz dostępne C# 3.0/.NET 3.5? – Noldorin

Odpowiedz

28

Adaptacja aktualny kod:

PersonList.Sort(delegate(Person p1, Person p2) { 
     int r = p1.Name.CompareTo(p2.Name); 
     if (r == 0) r = p1.Age.CompareTo(p2.Age); 
     if (r == 0) r = p1.Level.CompareTo(p2.Level); 
     return r; 
    }); 

lub, proste rozwiązanie linq-owski:

PersonList = PersonList.OrderBy(p => p.Name) 
         .ThenBy(p => p.Age) 
         .ThenBy(p => p.Level).ToList(); 
+0

Dzięki za poprawkę, Marc. Zdałem sobie sprawę z mojego błędu, ale internet jest niestabilny i miałem problemy z jego edycją. –

+0

Ach dobrze, edytowałeś to. Łańcuch zamówień nie działa :) – Thorarin

+0

Dobrze! Będąc na .Net 2.0, pierwsze rozwiązanie działa idealnie. Pozdrawiam króla. –

2

Wpisałbym IComparable na twoją klasę Person. W swojej niestandardowej metodzie porównywania możesz ustawić logikę, aby porównywać wszystkie trzy właściwości i upewnić się, że trzy mają właściwą "wagę" (np. Jeśli dwie instancje osoby mają tę samą nazwę, w przypadku następnego sortowania według wieku lub poziomu).

4

Czy rozważałeś przejście na .NET 3.5 i używanie LINQ? Takie rzeczy są naprawdę łatwe w LINQ:

personList = personList.OrderBy(p => p.Name). 
    ThenBy(p => p.Age).ThenBy(p => p.Level).ToList(); 
1

Zakładając, że używasz .NET 3,5

IQueryable<Person> people = PersonList.AsQueryable(); 

return people.OrderBy(x => x.Name).ThenBy(x => x.Age).ThenBy(x => x.level); 
0

Jeśli masz C# 3.0 dostępne (wsparcie LINQ), można wykonać następujące czynności:

var result = (from p in PersonList 
       orderby p.Name, p.Age, p.Level 
       select p).ToList(); 
0

Czy rozważałeś LINQ do obiektów?

var x = (from p in PersonList 
     orderby p.Name, p.Age, p.Level 
     select p).ToList(); 
0

Trzeba zadzwonić CompareTo na pierwszym własności chcesz zamówić przez, uzyskać wartość, która jest zwracana, a jeśli jest 0, a następnie zadzwonić CompareTo na kolejnej nieruchomości, i powtarzać, za każdym razem 0 jest wróć, przejdź do następnej właściwości, aż uzyskasz niezerową wartość (którą następnie zwrócisz) lub dojdziesz do końca właściwości, które chcesz posortować według.

0
var result = from p in persons 
      orderby p.Name, p.Age, p.Level 
      select p;