реализация интерфейса IComparable на двух строковых полях - PullRequest
6 голосов
/ 06 октября 2009

Как реализовать интерфейс 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);
});

Ответы [ 2 ]

11 голосов
/ 06 октября 2009

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

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

РЕДАКТИРОВАТЬ Как прокомментировал Марк, вы можете решить, что вам нужно проверить наличие нулей. Если это так, вы должны решить, следует ли сортировать значения NULL сверху или снизу. Примерно так:

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
1 голос
/ 06 октября 2009

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

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

if (surnameComparison <> 0)
  return surnameComparison;
else
  return p1.Forename.CompareTo(p2.Forename);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...