Opgave: Sorting Items - using IComparable and ICompare


I denne opgave tager vi udgangspunkt i eksemplet ItemsRazor ItemRazorV5.zip (fra 1. semester)





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.
Bemærk: Hvis Id, Name og Price er erklæret nullable (dvs der er benyttet '?'), så fjern '?' og initialiser properties i default konstruktøren (Id=0, Name="", Price=0)


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 Id 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"
Bemærk: husk at opdatere IItemService med den nye metode.


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

Nu 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 ItemService klassen med en SortByName-metode, metoden skal kalde Sort(new NameComperator()) med et objekt af den nye comperator på listen af Items (_items) og returnere den sorterede liste.
Bemærk: husk at opdatere IItemService med den nye metode.


Step 8 (GetAllItemsModel.html.cs)

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 9 (GetAllItems.html.cs)

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

 

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


Step 11 (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