Opgave: Sorting Items - using IComparable and ICompare


I denne opgave tager vi udgangspunkt i eksemplet ItemsRazor ItemRazorV3.zip





Opgaven går ud på at, det skal være muligt at få Computer Items vist sorteret efter id (ved klik på tabelhovedet 'id'), efter name (ved klik på tabelhovedet 'Name') og efter price (ved klik på tabelhovedet 'Price').
Denne funktionalitet skal du nu implementere gennem et række step:


Step 1 (Item : IComparable<Item>
For at kunne sortere Items efter Id (Id er valgt til 'naturlig orden') skal class Item implementere interfacet IComparable<Item> med metoden metoden CompareTo<Item other).
Hint: CompareTo metoden skal returnere noget positivt, hvis objektet selv er størst, 0 hvis lige store og noget negativt, hvis det andet objekt (det der gives som parameter) er størst - så overvej subtraktion mellem de to Id;


Step 2 (ItemService - SortById( ))
Opdater ItemService klassen med en SortById-metode, metoden skal kalde Sort( ) på listen af Items (items) og returnere den sorterede liste.


Step 3 (GetAllItemsModel - OnGetSortById)
Opdater klassen GetAllItemsModel (razor page: GetAllItems) med metoden OnGetSortById( ). Handler-metoden skal opdatere Items med en sorteret liste ved at kalde SortById fra ItemService og returnere Page().

Step 4 (GetAllItems.html.cs)
Vi skal nu implementere at en klik-event på table-header til Id-kolonnen resultere i et kald af handler-metoden OnGetSortById.
Det gøres lettest ved finde <th> elementet og wrappe <h5>Id</h5> ind i et <a> tag. a-elementet skal have en property: 'asp-page-handler="SortById"' så vi får bundet vores Sort-handler-metode til et klik-event på Id. Tilføj passende tooltip. Hint: data-toggle="tooltip" title="Sort By Id"


Step 5 (Afprøv)
Afprøv at den nye funktion virker.
Hint: Hvis den ikke virker er der nok en "stavefejl" - benyt evt Debugger ved at sætte et breakpoint ved SortById-metoden (check om den bliver kaldt?)

 

Ny skal vi have de to andre sorterings funktioner implementeret. Denne gang kan vi ikke benytte IComparable, da der kun kan være en"naturlig orden".
I denne opgave vælger vi at implementere Comperatorer der implementere interfacet ICompare.


Step 6 (NameComperator : ICompare)

Lav en ny mappe: Comperators og tilføj en ny klasse: NameComperator.
Klassen skal implementere interfacet ICompare<Item> og dermed metoden Compare(Item x, Item y). Metoden skal, tilsvarende IComparable's CompareTo metode, returnere en positiv, 0 og negativ værdi - her afhængigt af om objektet givet som første argument er størst, ligmed eller mindre end objektet givet som andet argument.
Hint: Udnyt at class String selv har implementeret IComparable, dvs du kan returnere: x.Name.CompareTo(y.Name);


Step 7 (ItemService - SortByName)

Opdater klassen GetAllItemsModel (razor page: GetAllItems) med metoden OnGetSortByName( ). Handler-metoden skal opdatere Items med en sorteret liste ved at kalde SortByName fra ItemService og returnere Page().


Step 8 (GetAllItems.html.cs)

Vi skal nu tilsvarende step 4, implementere klik-event handler på table-header til Name.

 

Step 9 (Afprøv)
Afprøv at den nye funktion virker.


Step 10 (Funktionaliteten SortByPrice)
Implementer funktionaliteten SortByPrice tilsvarende SortByName (step 6-9)


Step Ekstra (Price sorteret efter stigende/faldende orden)
Udvid applikationen så der kan vælges mellem stigende og faldende orden (ascending/descending)


God fornøjelse!
Henrik Høltzer