C# 如何按特定成员对对象列表进行排序?
假设我有一个Person对象列表: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下
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());