Как отсортировать список объектов по конкретному члену? - PullRequest
7 голосов
/ 25 июня 2010

Скажем, у меня есть список объектов Person:

class person
{
  int id;
  string FirstName;
  string LastName;
}

Как бы отсортировать этот список по члену LastName?

List<Person> myPeople = GetMyPeople();
myPeople.Sort(/* what goes here? */);

Ответы [ 7 ]

15 голосов
/ 25 июня 2010

List<T>.Sort отсортирует список на месте.Если это то, что вы хотите, сладко: используйте перегрузку, которая принимает Comparison<T> делегат :

List<Person> myPeople = GetMyPeople();
myPeople.Sort((x, y) => x.LastName.CompareTo(y.LastName));

Если вы не хотите изменять фактический список, но хотите перечислить болееего содержимое в отсортированном порядке, а затем, как другие предложили, вместо этого используйте метод расширения LINQ OrderBy (.NET 3.5 и выше).Этот метод может взять простой Func<T, TKey> селектор и упорядочить по клавишам, которые этот селектор ... вы знаете, выбирает.

List<Person> myPeople = GetMyPeople();
var orderedByLastName = myPeople.OrderBy(p => p.LastName);
14 голосов
/ 25 июня 2010

В C # 3.0 вы можете использовать следующий оператор linq:

var sortedEnumerable = myPeople.OrderBy( p => p.LastName );
3 голосов
/ 25 июня 2010

Как уже предлагали другие, вы можете использовать собственный метод IComparer для сортировки списка.Если вы делаете это только один раз, самый простой способ - использовать анонимный метод, такой как:

List<Person> myPeople = GetMyPeople();
myPeople.Sort(delegate(Person one, Person two)
{
    return one.LastName.CompareTo(two.LastName);
});

В качестве альтернативы, вы можете реализовать IComparable в вашем классе Person, чтобы классумеет сортировать себя:

class Person : IComparable<Person>
{
    int id;
    string FirstName;
    string LastName;

    public int CompareTo(Person other)
    {
        return LastName.CompareTo(other.LastName);
    }
}
2 голосов
/ 25 июня 2010

Один из вариантов - написать компаратор:

class LastNameComparer : IComparer<Person>
{
   public int Compare(Person x, Person y)
   {
       return String.Compare(x.LastName, y.LastName);
   }
}

Тогда

myPeople.Sort(new LastNameComparer());

Person также может реализовывать IComparable<Person>, и в этом случае будет достаточно myPeople.Sort(). Однако вы можете захотеть отсортировать по другим свойствам в других местах, так что это не общий метод; если вы хотите отсортировать по ID в другом отчете, вы можете написать другой IComparer, но у вас может быть только один IComparable<Person>.CompareTo(Person other) метод.

Если вы чувствуете себя ленивым или уверены, что больше не будете его использовать, вы также можете использовать лямбду:

myPeople.Sort((p1, p2) => String.Compare(p1.LastName, p2.LastName));
1 голос
/ 25 июня 2010

пример ICompare

   /// <summary>
   /// Sort class on LastName Descending Order
   /// </summary>
   private class PersonLastNameDescending : IComparer<Person>
   {
      public int Compare(Person aX, Person aY)
      {
         return aY.LastName.CompareTo(aX.LastName);
      } // end Compare(...)
   } // end inner class PersonLastNameDescending 

   MyPeople.Sort(new PersonLastNameDescending());
1 голос
/ 25 июня 2010

Пользовательский IComparer<person>.Если вы используете c # 3.0 и .net3.5, изучите методы LINQ, особенно IEnumerable<T>.OrderBy().

0 голосов
/ 25 июня 2010

Ничто не должно входить в ваш вызов метода "Sort", если ваш класс реализует IComparable.

Проверьте эту ссылку для подробностей.

Код:

class person : IComparable<person>
{ 
  int id; 
  string FirstName; 
  string LastName; 

public int CompareTo(person other)
    {
        //If you want to sort on FirstName
        return FirstName.CompareTo(other.FirstName);
    }


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