ICompare on System.Collections:n alla oleva luokka jota voidaan käyttää vertailuun.
ICompare sisältää metodin CompareTo, joka vertaa kahta objektia. Metodi palauttaa arvon riippuen siitä onko vertailtava objekti suurempi, yhtäsuuri tai pienempi kuin instanssi josta metodia kutsutaan.
int ICompare.CompareTo(object obj) //jos palautusarvo on pienempi kuin 0, oli instanssi pienempi kuin obj //jos palautusarvo on 0, oli instanssi yhtäsuuri kuin obj //jos palautusarvo on suurempi kuin 0, oli instanssi suurempi kuin obj
IComparea käytetään yleensä yhdessä Array.Sort tai Array.BinarySort metodien kanssa, antaen mahdollisuuden tehdä oma kustomoitu järjestelymetodi.
Esimerkki käytöstä:
//Pistetaulukon järjestely, muodossa string nimi, int Pisteet) Using System; Using System.Collections.Generic; Using System.Text; //Järjestyksen enumerointi public enum SortDirection { Ascending, //järjestely nousevassa järjestyksessä (0) Descending //laskevassa järjestyksessä (1) } //tulostyyppi pisteidenlaskun järjestelyä varten, muodossa (string, int) "Pertti",12 class HighScore { public string Name; public int Score; public Score() { } public Score(string _Name, int _Score) { this.Name = _Name; this.Score = _Score; } } //Järjestelyn luokka class Sorter : IComparable { private SortDirection M_Direction = SortDirection.Ascending; //Oletussuunta järjestelylle public Sorter() : base() { } public Sorter(SortDirection Direction) { this.M_Direction = Direction; //Suunnan määritys } //itse Vertailu int IComparer.Compare(object x, object y) { HighScore TulosX = (HighScore)x; HighScore TulosY = (HighScore)y; //jos molemmat objektit null, palautetaan 0 if(TulosX == null && TulosY == null) { return 0; } //jos TulosX on null, ja TulosY jotain muuta, palautetaan -1 jos valittu suunta on nouseva, jos valittu suunta on laskeva, palautetaan 1 else if (TulosX == null && TulosY != null) { return (this.M_direction == SortDirection.Ascending) ? -1 : 1; } //Jos TulosX on jotain muuta kuin null, ja TulosY on null, palautetaan 1 jos valittu suunta on nouseva. Jos valittu suunta on laskeva, palautetaan -1; else if (TulosX != null && TulosY == null) { return (this.M_Direction == SortDirection.Ascending) ? 1 : -1; } //Muussa tapauksessa, jos valittu suunta on nouseva, verrataan TulosX:n Score arvoa TulosY:n score arvoon CompareTo -metodilla (ks. alustus). jos valittu suunta on laskeva, verrataan TulosY:n Scorea TulosX:n Scoreen. else { return (this.M_Direction == SortDirection.Ascending) ? TulosX.Score.CompareTo(TulosY.Score) : TulosY.Score.CompareTo(TulosX.Score); } } } //Käyttö class MainClass { //Järjesteltävä ArrayList System.Collections.ArrayList ScoreList = new System.Collections.ArrayList(); public static void Main() { //Lisätään muutama tulos ScoreList.Add(new HighScore("Pertti",112)); ScoreList.Add(new HighScore("Jouni",20)); ScoreList.Add(new HighScore("Toni",90)); ScoreList.Add(new HighScore("Esko",9)); //Array.Sort metodin käyttö: //Sort metodi käy läpi kaikki taulukon objektit, joten foreach looppia ei tarvita //Sort metodin järjestelijäksi valitaan oma järjestelijä, Sorter) //Sort metodi järjestää taulukon riippuen siitä, mitä int arvoja järjestelijä objekteista palauttaa ScoreList.Sort(new Sorter(SortDirection.Descending)); //Tulostus foreach(HighScore _HighScore in ScoreList) { Console.WriteLine(_HighScore.Name + " ," + _HighScore.Score + " Pistettä"; } } }
Aihe on jo aika vanha, joten et voi enää vastata siihen.