webForumDet fria alternativet

Sortera en collection

.NET

9 svar · 430 visningar · startad av erka

Medlem sedan dec. 19996 522 inlägg
Frågan#1

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.

Medlem sedan maj 20012 812 inlägg
#2

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

Medlem sedan dec. 19996 522 inlägg
#3

Tack, ska kolla vidare på sortedList

Medlem sedan nov. 2003569 inlägg
#4

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

Medlem sedan maj 20012 812 inlägg
#5

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

Medlem sedan apr. 2004778 inlägg
#6

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.

Medlem sedan dec. 19996 522 inlägg
#7

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 :)

Medlem sedan apr. 2004778 inlägg
#8

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

Medlem sedan dec. 19996 522 inlägg
#9

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

Medlem sedan okt. 2002188 inlägg
#10

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.

254 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e
121 ms — deklarationer (db)
0 ms — hämta statistik (cache)
131 ms — hämta tråd, inlägg och bilagor (db)
120 ms — ändringar (db)