реализация интерфейса IComparable для двух строковых полей

Как реализовать интерфейс IComparable для двух строковых полей?

Используя приведенный ниже пример класса Person. Если объекты Person добавляются в список. Как отсортировать список сначала по фамилии, а потом по имени?

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

Что-то типа? :

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

person CSharpeANdJavaGuy123    schedule 06.10.2009    source источник


Ответы (2)


Или вы можете отсортировать список следующим образом:

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

В качестве альтернативы вы можете Person реализовать IComparable<Person> с помощью этого метода:

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

ИЗМЕНИТЬ Как прокомментировал Марк, вы можете решить, что вам нужно проверить наличие нулей. Если это так, вы должны решить, следует ли сортировать нули вверху или внизу. Что-то вроде этого:

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
person Drew Noakes    schedule 06.10.2009
comment
Как насчет проверки нулей в .Surname? - person tymtam; 05.07.2011
comment
@Tymec, просто повторите тот же шаблон, что и для p1 и p2, но с p1.Surname и p2.Surname. - person Drew Noakes; 07.07.2011

Попробуй это?

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

if (surnameComparison <> 0)
  return surnameComparison;
else
  return p1.Forename.CompareTo(p2.Forename);
person Lennaert    schedule 06.10.2009