2009-10-06 13 views
6

¿Cómo implemento la interfaz IComparable en dos campos de cadena?implementando la interfaz IComparable en dos campos de cadena

Usando el ejemplo de la clase Persona a continuación. Si los objetos Person se agregan a una lista. ¿Cómo ordeno la lista basada en Apellido primero THEN Forename?

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

¿Te gusta? :

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

Respuesta

9

O puede ordenar una lista como esta:

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

Alternativamente, usted podría tener Person implemento IComparable<Person> con este método:

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

EDITAR Como Mark comentó, se podría decidir que necesita verificar nulos. De ser así, debe decidir si los valores nulos se deben clasificar en la parte superior o inferior. Algo como esto:

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

Recuerde que debe comprobar si hay valores nulos en una implementación de producción ... –

+0

¿Qué pasa con la comprobación de valores nulos en .Surname? – mayu

+0

@Tymec, simplemente repita el mismo patrón que el utilizado para p1 y p2, pero con p1.Surname y p2.Surname. –

1

¿Intentas esto?

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

if (surnameComparison <> 0) 
    return surnameComparison; 
else 
    return p1.Forename.CompareTo(p2.Forename); 
Cuestiones relacionadas