---
title: "Sortera en collection"
type: "forum-thread"
url: "https://www.webforum.nu/amne/dotnet/114884-sortera-en-collection"
topic: ".NET"
topic_url: "https://www.webforum.nu/amne/dotnet"
author: "erka"
published: "2004-11-01T17:24:26.000Z"
updated: "2004-11-02T12:58:52.000Z"
replies: 9
views: 456
page: 1
pages: 1
language: "sv-SE"
site: "webForum — webforum.nu"
rights: "Upphovsrätten till varje inlägg tillhör dess författare."
attribution: "Citera som: webForum, https://www.webforum.nu/amne/dotnet/114884-sortera-en-collection"
---

# Sortera en collection

## #1 — erka, 2004-11-01T17:24Z

Hej

Jag försöker sortera en meny som består av menyitems, där ett menyitems antingen kan vara en undermeny till redan befintlig menyitem eller ett helt vanlig menyitem.

Jag har en collection (som ärver från collectionbase) som innehåller objekt av en klass som jag har döpt till MenuItem,. Jag är ni i behov att sortera den efter följande

Ett MenuItem kan ha ett int värde i en property som heter ParentMenuItemId, default är 0 (om den inte hör till något tidigare menu, alltså ingen undermeny). ParentMenuItemId talar alltså om ifall det är en undermeny till någon redan existerande MenuItem eller inte. 

När jag fyller min collection hammnar de huller och buller, jag vill sortera så att de MenuItem med 0 i ParentMenuItemId hamnar i bokstavsordning, men direkt efter varje MenuItem med 0 i ParentMenuItemId kommer dess matchande undermenyer (behöver ej vara i bokstavsordning).

Varje MenuItem har en property som heter MenuItemId (int) och det är dessa värdet som kan finnas i ParentMenuItemId. Någon som har någon aning om hur jag ska lösa en sådan sortering.

Tacksam för hjälp.

Permalänk: https://www.webforum.nu/p/114884

## #2 — Gladh, 2004-11-01T18:38Z

Det finns två vägar som du kan gå.

Antingen så inkluderar du en SortedList i din Collection och plockar dina värden därifrån, eller så låter du alla dina object som du lägger in i din collection implementerar IComparable och sedan skriver du själv en liten sorteringsmethod i din collection.

Lösning 2 är snyggast men lösning 1 är enklast. Bara att fylla din sortedList från din collectionbase när du behöver sortera din collection och sedan hämta alla värden från din sortedList.

\- M

Permalänk: https://www.webforum.nu/p/1474425

## #3 — erka, 2004-11-01T20:13Z

Tack, ska kolla vidare på sortedList

Permalänk: https://www.webforum.nu/p/1474461

## #4 — Nöff, 2004-11-01T21:42Z

Varför inte använda ett DataTable eller DataSet, där har du sortering helt gratis :)

Permalänk: https://www.webforum.nu/p/1474521

## #5 — Gladh, 2004-11-02T07:41Z

> Varför inte använda ett DataTable eller DataSet, där har du sortering helt gratis

Lite onödigt att lägga in alla värden i en DataTable / DataSet om du redan har de i en collection, snyggast är om de olika items implementerar IComparable interfacet och så skapar man en sorteringsrutin med hjälp av de.

Sedan är frågan om man skulle använda DataTable/DataSet istället för en collection, men det är en annan fråga och den har vi diskuterat förr :)

\- M

Permalänk: https://www.webforum.nu/p/1474575

## #6 — PDahlen, 2004-11-02T09:52Z

En fråga, hur fyller du din collection? Hämtar du allt ur en databas? 
I så fall sortera allt i själv sql-frågan.

Permalänk: https://www.webforum.nu/p/1474617

## #7 — erka, 2004-11-02T11:57Z

PDahlen, ja jag hämtar den från en db och sorterar den med sqlfrågan, dock vill jag inte använda mig av den sorteringen där eftersom den inte verkar vara så bra prestandamässigt. 

SQL frågan ser ut så här

```
SELECT Pk_MenuItemId, Fk_MenuId, NavigateUrl, NavigateText, ParentMenuItemId ,
case when ParentMenuItemId = 0 then NavigateText
else (select NavigateText from PageMenuItems
where Fk_MenuId = @menuId 
  and Pk_MenuItemId = pm.parentMenuItemId) end as n
FROM  PageMenuItems pm
WHERE Fk_MenuId = @menuId 
Order by n,ParentMenuItemId
```

Tänkte det kunde vara ett bra tillfälle att lära sig lite med om sorteringsalgoritmer och förfarande vid sorteringar av collections :)

Permalänk: https://www.webforum.nu/p/1474671

## #8 — PDahlen, 2004-11-02T12:01Z

Prestandamässigt så kan jag nog på rak arm säga att sql-frågan är snabbare än att sortera en collection eller använda ett dataset.
Den enda skillnaden i din sql-fråga från nu är ju att du utökar din order by.
Du slipper ju ett helt steg.
Visst är det bra att lära sig sorteringsalgoritmer och hur man sorterar collections, men det är kanske bättre att använda det när det passar. ;)

Permalänk: https://www.webforum.nu/p/1474673

## #9 — erka, 2004-11-02T12:18Z

Jag bara laborerar för tillfället, inget som ska ut i en skarp miljö. Men tack för synpunkterna ;)

Permalänk: https://www.webforum.nu/p/1474683

## #10 — Walker, 2004-11-02T12:58Z

En alternativ som jag använt är att du skapar dig en egen klass som implementerar icompare. Du plockar sedan ut värden genom reflection och bara kontrollerar värdena. precis som genom compare. har gjort en sådan och det fungerar ganska bra. Man skickar in vilka fält man vill sortera på och i vilken rikting. tex ålder, desc, namn och desc. Först sorterar den på  ålder och sen på namn. Fungerar ganska smidigt. Man kan tom sortera på andra fält än i det "första" objektet  tex order.client.Id om du har en lista med ett antal orders.

Permalänk: https://www.webforum.nu/p/1474715

---

Tråden på webben: https://www.webforum.nu/amne/dotnet/114884-sortera-en-collection
