csharp.aspone.cz csharp.aspone.cz

Delegáti

Těžší demonstrace na použití delegátů.

using System;

// nadefinujeme si delegáta
public delegate bool bigger(object a, object b);

// nadefinujeme si strukturu (objekt) adresa
public struct mojeAdresa
{
  public string jmeno;
  public string ulice;
  public int psc;
  public string mesto;
}

// objekt pro třídění
public class Sorter
{
  // vytvoříme si pole (aneb pole ukazatelů na mojeAdresa)
  private mojeAdresa[] adr = new mojeAdresa[5];

// metoda, která prohodí adresy
void Swap(ref mojeAdresa a, ref mojeAdresa b)
{
  mojeAdresa x = new mojeAdresa();
  x = a;
  a = b;
  b = x;
}

// metoda pro nastavení jedné adresy
public void SetAdr(int a, string j, string u, string m, int p)
{
  // nastavíme si svou adresu
  this.adr[a].jmeno = j;
  this.adr[a].ulice = u;
  this.adr[a].psc   = p;
  this.adr[a].mesto = m;
}

// ještě si převedeme adresu pěkně na string formát
public string adrToString(int a)
{
  return string.Format("{0},{1}", this.adr[a].jmeno, this.adr[a].psc);
}

// sortuj (řaď)
public void doSort(bigger isBigger)
{
  bool changed = false;
  do
  {
    changed = false;
    for (int i = 1; i < 5; i++)
    {
      if (isBigger(adr[i-1],adr[i]))
      {
        Swap(ref adr[i-1], ref adr[i]);
        changed = true;
      }
    }
  } while (changed); 
}

// statická metoda
public static bool pscBigger(object a, object b)
{
  myAddress x = (myAddress)(a);
  myAddress y = (myAddress)(b);
  // šlo by napsat i jinak
  return (x.psc > y.psc)?true:false;
}

// statická metoda
public static bool jmenoBigger(object a, object b)
{
  myAddress x = (myAddress)(a);
  myAddress y = (myAddress)(b);
  return (string.Compare(x.jmeno,y.jmeno)>0);
}
}

// a začneme testovat
public class MainClass
{
  public static int Main(string[] args)
  {
    Sorter mySort = new Sorter();

    // načtení hodnot
    for (int i = 0; i < 5; i++)
    {
      Console.Write("Jméno: ");
      string j = Console.ReadLine();
      Console.Write("Ulice: ");
      string u = Console.ReadLine();
      Console.Write("PSČ: ");
      int p = Int32.Parse(Console.ReadLine());
      Console.Write("Město: ");
      string m = Console.ReadLine();
      
      mySort.SetAddr(i, j, u, m, p);
    }

    // vytvoření instance delegáta
    bigger isBigger = new bigger(Sorter.pscBigger);

    // volání třídící metody
    mySort.doSort(isBigger);

    // výpis setříděného pole
    for (int i = 0; i < 5; i++)
    {
      Console.WriteLine(mySort.adrToString(i));
    }

    // a to celé ještě jednou podle jmen
    isBigger = new bigger(Sorter.jmenoBigger);
    mySort.doSort(isBigger);
    Console.WriteLine();
    
    for (int i = 0; i < 5; i++)
    {
      Console.WriteLine(mySort.adrToString(i));
    }

    return 0;
  }
}