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