2009-06-09 3 views
7

Dire che ho una classe Persona con proprietà Nome, Età, Livello.C# Elenco <> Ordina con 3 proprietà .Net 2.0

so come ordinare da una delle proprietà, con

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

Ma come posso ordinare per nome, età e livello.

Un Equivalente della frase SQL: ORDER BY nome, età, livello

Grazie

+0

Avete disponibile C# 3.0/.NET 3.5? – Noldorin

risposta

28

Adattare il codice corrente:

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; 
    }); 

o, una soluzione semplice LINQ-ish:

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

Grazie per la correzione, Marc. Mi sono reso conto del mio errore, ma Internet si sta squilibrando e ho avuto problemi a modificarlo. –

+0

Ah bene, l'hai modificato. Ordine di concatenamentoBys non funziona :) – Thorarin

+0

Buono !!! Essendo su .Net 2.0, la prima soluzione funziona perfettamente. King riguarda. –

2

Mi piacerebbe impiantare IComparable nella classe Persona. Nel tuo metodo di confronto personalizzato, puoi impostare la logica per confrontare su tutte e tre le proprietà e assicurarti che i tre abbiano il giusto "peso" (ad esempio, se due istanze di Persona hanno lo stesso nome, dovresti ordinare successivamente su Età o Livello).

4

Hai mai pensato di passare a .NET 3.5 e utilizzare LINQ? Cose come questa sono veramente facili in LINQ:

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

si Supponendo che si utilizza NET 3,5

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

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

Se si dispone di C# 3.0 disponibile (supporto LINQ), allora si può fare quanto segue:

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

Hai considerato LINQ per gli oggetti?

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

è necessario chiamare CompareTo sulla prima proprietà che si desidera ordinare da, ottenere il valore che viene restituito, e se è 0, quindi chiamare CompareTo sulla proprietà prossimo, e ripetere, ogni volta 0 è restituito, continuare sulla proprietà successiva fino a quando non si ottiene un valore diverso da zero (che si restituisce) o si arriva alla fine delle proprietà che si desidera ordinare.

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