Søg på DotNyt:
Denne blog er flyttet til www.nielsbrinch.com


lørdag den 24. marts 2007

Den nemmeste måde at sortere objekter på

skrevet af Niels Brinch

Der er masser af muligheder for sortering i .NET, men de er allesammen ret besværlige for mig. Jeg skal altid bruge dokumentation eller kigge i gammel kode for at lave en ny sortering. Det kræver delegates og dem vil jeg gerne undgå om muligt - også fordi de er skyld i at logikken unødvendigt bliver spredt ud over flere steder. Hvis logikken skal spredes vil jeg selv bestemme det.

Hvor tit har I haft en liste af objekter som bare skal standard-sorteres ud fra en bestemt property på objektet? Det burde være et simpelt metodekald - det kan man gøre med Reflection, men det giver ikke en effektiv sortering - i stedet kan man gøre som beskrevet her.

I mit eksempel har jeg et array af Person-objekter som har en Salary og sikkert også nogle andre properties. Jeg vil gerne sortere dem efter deres Salary.

Person[] persons = GetPeople();
int[] salaries = new int[persons.Length];
for (int i = 0; i < persons.Length; i++)
{
  salaries[i] = persons[i].Salary;
}
Array.Sort(salaries, persons);

Ja, tro det eller ej. Arrayet persons er nu sorteret efter Salary. Så nemt kan det gøres!

4 kommentarer

4 Kommentarer:

At 25. marts 2007 kl. 17.03, Blogger Christian H. Nielsen skrev...

Meget smart trick, men en overvejelse jeg ville tage med er om ikke man skal lade klassen der skal sorteres implementere IComparable.

Hvis man har en (eller flere sammentrukne) properties som er representative for klassen, og som altid er dem der sorteres på er det en pænere løsning. På den måde undgår man at skulle trække de værdier ud der skal sammenlignes, og man får lagt sammenligningslogikken på objektet hvor den "hører hjemme".

 
At 26. marts 2007 kl. 09.39, Blogger Niels Brinch skrev...

Jeg er helt enig i at det er "den rigtige" og "anbefalede" måde at sortere på.

I mit eksempel er objekterne f.eks. automatisk dannet ud fra en webservice-reference, hvilket betyder jeg ikke har mulighed for at sætte en IComparable på.

 
At 31. oktober 2007 kl. 19.52, Blogger Niels Brinch skrev...

Jeg har anvendt dette et par gange siden. Hver gang vender jeg ironisk nok tilbage til dette blog-post for at komme i tanke om hvordan det var :)

 
At 2. juni 2008 kl. 11.47, Blogger Niels Brinch skrev...

...og nu er der jo så kommet en MEGET nemmere måde at sortere på. LINQ:

list =
(from p in myList
orderby p.Salary descending
select p).ToList()

Eller noget.

 

Send en kommentar

<< Tilbage


 
Til forsiden

Niels Brinch