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

C# 如何按特定成员对对象列表进行排序?,c#,.net,list,sorting,C#,.net,List,Sorting,假设我有一个Person对象列表: class person { int id; string FirstName; string LastName; } 我将如何按姓氏成员对该列表进行排序 List<Person> myPeople = GetMyPeople(); myPeople.Sort(/* what goes here? */); List myPeople=GetMyPeople(); myPeople.Sort(/*这里是什么?*/); 在C#3.0下

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

class person
{
  int id;
  string FirstName;
  string LastName;
}
我将如何按姓氏成员对该列表进行排序

List<Person> myPeople = GetMyPeople();
myPeople.Sort(/* what goes here? */);
List myPeople=GetMyPeople();
myPeople.Sort(/*这里是什么?*/);
在C#3.0下,您可以使用以下linq语句:

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

自定义
i比较程序
。如果您使用的是c#3.0和.net3.5,请查看LINQ方法,特别是
IEnumerable.OrderBy()

一个选项是编写比较器:

class LastNameComparer : IComparer<Person>
{
   public int Compare(Person x, Person y)
   {
       return String.Compare(x.LastName, y.LastName);
   }
}
Person
也可以实现
IComparable
,在这种情况下
myPeople.Sort()
就足够了。但是,您可能希望按其他位置上的其他属性进行排序,因此这不是通用方法;如果要在另一个报表上按
ID
排序,可以编写另一个
IComparer
,但只能有一个
IComparable.CompareTo(Person-other)
方法

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

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

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

List<Person> myPeople = GetMyPeople();
myPeople.Sort(delegate(Person one, Person two)
{
    return one.LastName.CompareTo(two.LastName);
});
List myPeople=GetMyPeople();
myPeople.Sort(委托人(第一人、第二人)
{
返回一个.LastName.CompareTo(两个.LastName);
});
或者,您可以在Person类上实现,以便该类知道如何对自己进行排序:

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

    public int CompareTo(Person other)
    {
        return LastName.CompareTo(other.LastName);
    }
}
class-Person:i可比较
{
int-id;
字符串名;
字符串LastName;
公共int比较(其他人)
{
返回LastName.CompareTo(其他.LastName);
}
}
列表。排序
将对列表进行适当排序。如果这是你想要的,甜心:使用:


如果类实现了
IComparable
,则无需在“Sort”方法调用中进行任何操作

查看此项了解详细信息

代码:

class-person:i可比较
{ 
int-id;
字符串名;
字符串LastName;
公共int比较(其他人)
{
//如果你想按名字排序
返回FirstName.CompareTo(其他.FirstName);
}
} 
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());
//
///按姓氏降序排序类
/// 
私有类PersonLastNameDescending:IComparer
{
公共整数比较(人员aX、人员aY)
{
返回aY.LastName.CompareTo(aX.LastName);
}//结束比较(…)
}//结束内部类PersonLastNameDescending
MyPeople.Sort(newPersonLastNameDescending());

目前为止的最佳答案。为每个要排序的属性创建一个IComparer很烦人。如果您需要排序顺序,LINQ中还有OrderByDescending方法。重复:
List<Person> myPeople = GetMyPeople();
myPeople.Sort((x, y) => x.LastName.CompareTo(y.LastName));
List<Person> myPeople = GetMyPeople();
var orderedByLastName = myPeople.OrderBy(p => p.LastName);
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);
    }


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