2009-10-06 13 views
6

Come si implementa IComparable Interface su due campi stringa?implementazione dell'interfaccia IComparable su due campi stringa

Utilizzando l'esempio di classe Person riportato di seguito. Se gli oggetti Person vengono aggiunti a un elenco. Come faccio a ordinare l'elenco in base a Cognome prima THEN Nome?

Class Person 
{ 
    public string Surname { get; set; } 
    public string Forname { get; set; } 
} 

Qualcosa come? :

myPersonList.Sort(delegate(Person p1, Person p2) 
{ 
    return p1.Surname.CompareTo(p2. Surname); 
}); 

risposta

9

Oppure si potrebbe ordinare una lista come questa:

myPersonList.Sort(delegate(Person p1, Person p2) 
{ 
    int result = p1.Surname.CompareTo(p2.Surname); 
    if (result == 0) 
     result = p1.Forname.CompareTo(p2.Forname); 
    return result; 
}); 

In alternativa si potrebbe avere Person attuare IComparable<Person> con questo metodo:

public int CompareTo(Person other) 
{ 
    int result = this.Surname.CompareTo(other.Surname); 
    if (result == 0) 
     result = this.Forname.CompareTo(other.Forname); 
    return result; 
} 

EDIT Come Mark ha commentato, è potrebbe decidere che è necessario verificare la presenza di null. In tal caso, è necessario decidere se i valori nulli devono essere ordinati in alto o in basso. Qualcosa del genere:

if (p1==null && p2==null) 
    return 0; // same 
if (p1==null^p2==null) 
    return p1==null ? 1 : -1; // reverse this to control ordering of nulls 
+0

Ricordarsi di verificare la presenza di valori nulli in un'implementazione di produzione ... –

+0

Che dire il controllo per i valori nulli in .Surname? – mayu

+0

@Tymec, basta ripetere lo stesso schema usato per p1 e p2, ma con p1. Nome e p2. Nome. –

1

Prova questo?

int surnameComparison = p1.Surname.CompareTo(p2.Surname); 

if (surnameComparison <> 0) 
    return surnameComparison; 
else 
    return p1.Forename.CompareTo(p2.Forename); 
Problemi correlati