如何按特定成员对对象列表进行排序?

时间:2010-06-24 20:39:54

标签: c# .net list sorting

假设我有一个Person对象列表:

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

如何按LastName成员对此列表进行排序?

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

7 个答案:

答案 0 :(得分:15)

List<T>.Sort将按原样对列表进行排序。如果这就是你想要的,那就甜蜜了:使用the overload that takes a Comparison<T> delegate

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

如果您不想修改实际列表但希望按排序顺序枚举其内容,那么,正如其他人所建议的那样,请使用the LINQ extension method OrderBy(.NET 3.5及更高版本)。这个方法可以采用一个简单的Func<T, TKey>选择器,并通过这个选择器......你知道,选择的键来排序。

List<Person> myPeople = GetMyPeople();
var orderedByLastName = myPeople.OrderBy(p => p.LastName);

答案 1 :(得分:14)

在C#3.0下,您可以使用以下linq语句:

var sortedEnumerable = myPeople.OrderBy( p => p.LastName );

答案 2 :(得分:3)

正如其他人所建议的那样,您可以使用自定义IComparer方法对列表进行排序。如果你只做一次,最简单的方法就是使用匿名方法:

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

或者,您可以在Person类上实现IComparable,以便类知道如何对自身进行排序:

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

    public int CompareTo(Person other)
    {
        return LastName.CompareTo(other.LastName);
    }
}

答案 3 :(得分:2)

一种选择是编写比较器:

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)方法。

如果你感到懒惰,或者确定你不会再使用它,你也可以使用lambda:

myPeople.Sort((p1, p2) => String.Compare(p1.LastName, p2.LastName));

答案 4 :(得分:1)

自定义IComparer<person>。如果您使用的是c#3.0和.net3.5,请查看LINQ方法,特别是IEnumerable<T>.OrderBy()

答案 5 :(得分:1)

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

答案 6 :(得分:0)

如果您的类实现IComparable,则无需进入“Sort”方法调用。

查看此link了解详细信息。

代码:

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


}