我有一个关于在C#中排序的问题。
让我们假设List<Person> personList
有50个项目
每个Person
都有string forename, surname
。
现在我想对这份人员名单进行排序
首先,列表应按Forename
排序
因此我会用这个:
personList.Sort((p1, p2)=>string.Compare(p1.Forename, p2.Forname, true));
在此之后,我想根据Forname
对所有条目Surname
进行排序。
我该怎么做?
编辑: @Russ Cam:这是一个示例列表。
未排序:
David Johnson
William Black
David Smith
Matthew Edwards
Jayden Anderson
Andrew Connor
Adam Johnson
Daniel Armstrong
Steve Anderson
Daniel Black
排序:
Adam Johnson
Andrew Connor
Daniel Armstrong
Daniel Black
David Johnson
David Smith
Jayden Anderson
Matthew Edwards
Steve Anderson
William Black
答案 0 :(得分:8)
您可以使用LINQ的OrderBy
方法来执行此操作
var sortedPersonList = personList.OrderBy(p => p.Forename).ThenBy(p => p.Surname);
修改强>
这是一个完整的控制台应用程序,用于验证它是否按照您期望的顺序返回结果
static void Main()
{
var personList = new List<Person>{
new Person("David Johnson"),
new Person("William Black"),
new Person("David Smith"),
new Person("Matthew Edwards"),
new Person("Jayden Anderson"),
new Person("Andrew Connor"),
new Person("Adam Johnson"),
new Person("Daniel Armstrong"),
new Person("Steve Anderson"),
new Person("Daniel Black")
};
var sortedPersonList = personList.OrderBy(p => p.Forename).ThenBy(p => p.Surname);
foreach (var person in sortedPersonList)
{
Console.WriteLine(person);
}
Console.Read();
}
public class Person
{
public Person(string name)
{
var names = name.Split(' ');
Forename = names[0];
Surname = names[1];
}
public string Forename { get; set; }
public string Surname { get; set; }
public override string ToString()
{
return Forename + " " + Surname;
}
}
写出来的
Adam Johnson
Andrew Connor
Daniel Armstrong
Daniel Black
David Johnson
David Smith
Jayden Anderson
Matthew Edwards
Steve Anderson
William Black
答案 1 :(得分:2)
这完美无缺
personList.Sort((p1, p2)=>string.Compare(p1.Forename+p1.Surname, p2.Forname+ p2.Surname, true));
答案 2 :(得分:2)
您可以Person
实施System.IComparable<Person>
。
public class Person : IComparable<Person>
{
public string Forename { get; set; }
public string Surname { get; set; }
public int CompareTo(Person other)
{
int comp = Forename.CompareTo(other.Forename);
if (comp != 0) {
return comp;
}
return Surname.CompareTo(other.Surname);
}
}
使用此定义,您可以直接使用
进行排序personList.Sort();
您还可以将IComparer<T>
传递给Sort
方法。这允许您为人员定义不同的排序(按名称,按年龄,按工资等)。
public class ComparePersonsByName : IComparer<Peron>
{
public static readonly ComparePersonsByName Instance =
new ComparePersonsByName();
private ComparePersonsByName()
{
}
public int Compare(Person x, Person y)
{
int comp = x.Forename.CompareTo(y.Forename);
if (comp != 0) {
return comp;
}
return x.Surname.CompareTo(y.Surname);
}
}
现在您可以使用
进行排序personList.Sort(ComparePersonsByName.Instance);
注意:我在这里使用单例模式的变体。
您可能必须在现实生活场景中添加null
引用的测试。