Выборочная сортировка (IComparer на три поля) - PullRequest
15 голосов
/ 21 декабря 2010

У меня есть личный класс с тремя полями: «Название», «Имя», «Пол», и я хотел бы создать пользовательскую сортировку для его сортировки: сначала по названию, затем по имени, а затем по возрастанию по полу:

public class SortPerson : IComparer
    {
        public int Compare(object x, object y)
        {
            (…)
        }
    }

Я знаю, как сделать это только для одной переменной для сравнения: Но как мне быть с тремя?

public class SortPerson : IComparer
        {

int IComparer.Compare(object a, object b)
   {
      Person p1=(Person)a;
      Person p2=(Person)b;
      if (p1.Title > p2.Title)
         return 1;
      if (p1.Title < p2.Title)
         return -1;
      else
         return 0;
   }
}

Большое спасибо,

Ответы [ 3 ]

34 голосов
/ 21 декабря 2010
//Assuming all the fields implement IComparable
int result = a.field1.CompareTo(b.field1);
if (result == 0)
  result = a.field2.CompareTo(b.field2);
if (result == 0)
  result = a.field3.CompareTo(b.field3);
return result;
6 голосов
/ 22 декабря 2010

Я не знаю, что вы используете для сравнения, но, возможно, вы могли бы использовать вместо сравнения оператор LINQ "order by", который позволяет сортировать по различным полям:

var orderedListPersons =
    from p in listPersons
    orderby p.Title, p.Name, p.Gender
    select person;

будет заказывать список лиц так, как вы хотите.Вы также можете использовать методы LINQ OrderBy и ThenBy для одной и той же вещи с другим синтаксисом:

var orderedlistPersons = listPersons.OrderBy(p => p.Title).ThenBy(p => p.Name).ThenBy(p => p.Gender);
0 голосов
/ 21 декабря 2010

Сортировка по одному полю за раз, в порядке приоритета, только переход к следующему полю, если сравнение предыдущего поля привело к 0 (поля равны).Ниже приведен пример сортировки с двумя полями.

http://csharp.2000things.com/2010/10/30/135-implementing-icomparable-to-allow-sorting-a-custom-type/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...