Kirjautuminen

Haku

Tehtävät

Keskustelu: Koodit: IComparer sorting (C#)

groovyb [14.01.2011 00:10:00]

#

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ä";
      }

   }

}

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta