mercoledì 10 novembre 2010

List.Sort( )

Decisamente ostico, ma di sicura utilità...
Imbattersi in un sort su elementi complessi non è sempre una cosa semplice, anzi il più delle volte siamo noi a dover implementare una logica di Sort.

Gia ma come fare ???

Eccovi un esempio completo e funzionante di come creare un sort

Create una console Application in C# e copiate interamente il codice.

using System;
using System.Collections.Generic;
using System.Net;
using System.Text;

namespace ListT_Sort
{
class Program
{
static void Main(string[] args)
{
UseHost uh = new UseHost();

uh.CreateHostList();

uh.SortBeforePrint();

Console.ReadLine();
}
}

public class Host
{
private string _HostName;
private IPAddress _HostIP;

public string HostName
{
get{return _HostName;}
set{_HostName = value;}
}

public IPAddress HostIP
{
get{return _HostIP;}
set{_HostIP = value;}
}

public Host( string Name, IPAddress IP)
{
_HostName = Name;
_HostIP = IP;
}


}

public class UseHost
{
private List Hosts = new List();

public void CreateHostList()
{
Hosts.Add(new Host("OfficePC", IPAddress.Parse("175.10.33.1")));
Hosts.Add(new Host("Localhost",IPAddress.Parse("127.0.0.1")));
Hosts.Add(new Host("HomePC",IPAddress.Parse("192.168.3.1")));
Hosts.Add(new Host("PortablePC",IPAddress.Parse("194.30.5.28")));
Hosts.Add(new Host("AbtServer", IPAddress.Parse("196.221.5.28")));
}

public void SortBeforePrint()
{
Hosts.Sort(CompareHosts);

for (int i =0; i< Hosts.Count; i++)
{
Console.WriteLine (Hosts[i].HostName);
}
}

public int CompareHosts(Host hp1, Host hp2)
{
if ((hp1 == null) && (hp2 == null))
{
return 0;
}

if ((hp1 == null) && (hp2 != null))
{
return -1;
}

if ((hp1 != null) && (hp2 == null))
{
return 1;
}

if (hp1.HostName == hp2.HostName)
{
return 0;
}

return String.CompareOrdinal(hp1.HostName, hp2.HostName);
}
}
}


Spiegazione pezzo per pezzo..

Questo è il tipo che noi abbiamo implementato o che abbiamo bisogno di implementare.
Si tratta di un tipo semplice tuttavia non implementa altre interfaccie ma solo due
campi.
Tuttavia già questa struttura è una buona base su cui studiare il sort.

public class Host
{
private string _HostName;
private IPAddress _HostIP;

public string HostName
{
get{return _HostName;}
set{_HostName = value;}
}

public IPAddress HostIP
{
get{return _HostIP;}
set{_HostIP = value;}
}

public Host( string Name, IPAddress IP)
{
_HostName = Name;
_HostIP = IP;
}
}

Ho implementato il costruttore solo per fare più in fretta...

Lista degli Host che dobbiamo Ordinare... messa giù un po a caso...

Hosts.Add(new Host("OfficePC", IPAddress.Parse("175.10.33.1")));
Hosts.Add(new Host("Localhost",IPAddress.Parse("127.0.0.1")));
Hosts.Add(new Host("HomePC",IPAddress.Parse("192.168.3.1")));
Hosts.Add(new Host("PortablePC",IPAddress.Parse("194.30.5.28")));
Hosts.Add(new Host("AbtServer", IPAddress.Parse("196.221.5.28")));


Chiamata al metodo di Sort ...
Hosts.Sort(CompareHosts);


Comparazione fra elementi...

if ((hp1 == null) && (hp2 == null))
{
return 0;
}

Gli elementi sono uguali ( e nulli )

if ((hp1 == null) && (hp2 != null))
{
return -1;
}

il secondo elemento è per forza maggiore il primo è null!!

if ((hp1 != null) && (hp2 == null))
{
return 1;
}

Il primo elemento è il maggiore ( vedi sopra)
if (hp1.HostName == hp2.HostName)
{
return 0;
}


Bene dato che il mio elemento di comparazione sono
i campi nome .. li confronto..
return String.CompareOrdinal(hp1.HostName, hp2.HostName);

Smart and Easy...

Nessun commento: