2009-10-06 15 views
6

Jak zaimplementować interfejs IComparable na dwóch polach łańcucha?implementowanie interfejsu IComparable na dwóch polach ciągów znaków

Korzystanie z przykładu klasy Person poniżej. Jeśli obiekty osoby zostaną dodane do listy. Jak sortować listę na podstawie nazwiska najpierw THEN Imię?

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

Coś jak? :

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

Odpowiedz

9

Albo można posortować listę tak:

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

Alternatywnie można mieć Person wdrożyć IComparable<Person> z tą metodą:

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

EDIT Jak Mark skomentował cię może zdecydować, że musisz sprawdzić wartości zerowe. Jeśli tak, powinieneś zdecydować, czy wartości null powinny być posortowane do góry czy do dołu. Coś takiego:

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

Pamiętaj o sprawdzeniu wartości pustych w implementacji produkcyjnej ... –

+0

Co powiesz na sprawdzanie wartości null w .Swoja? – mayu

+0

@Tymec, po prostu powtórz ten sam wzór, jak w przypadku p1 i p2, ale z p1.Nazwa i p2.Nazwa. –

1

Spróbuj tego?

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

if (surnameComparison <> 0) 
    return surnameComparison; 
else 
    return p1.Forename.CompareTo(p2.Forename); 
Powiązane problemy