假设我有一个Person对象列表:
class person
{
int id;
string FirstName;
string LastName;
}
如何按LastName成员对此列表进行排序?
List<Person> myPeople = GetMyPeople();
myPeople.Sort(/* what goes here? */);
答案 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);
}
}