📅  最后修改于: 2023-12-03 14:39:46.200000             🧑  作者: Mango
在 C# 中,我们可以使用 LINQ(语言集成查询)来对对象列表进行排序。在本篇文章中,我们将探讨两种常见的排序方式:按照属性和自定义排序。
假设我们有以下一个名为 Person 的类:
public class Person {
public string Name { get; set; }
public int Age { get; set; }
}
我们有一个 Person 对象的列表,我们希望按照 Age 属性进行排序。下面是如何使用 LINQ 来实现:
List<Person> people = new List<Person>() {
new Person { Name = "Alice", Age = 25 },
new Person { Name = "Bob", Age = 20 },
new Person { Name = "Charlie", Age = 30 }
};
var sortedPeople = people.OrderBy(p => p.Age);
foreach (var person in sortedPeople) {
Console.WriteLine($"{person.Name} ({person.Age})");
}
这将输出:
Bob (20)
Alice (25)
Charlie (30)
我们使用 OrderBy()
方法来排序,参数是一个 lambda 表达式,用于指定要排序的属性。在这个例子中,我们传递了 p => p.Age
作为 lambda 表达式,表示按照 Age 属性进行排序。
我们也可以按照 Name 属性进行排序,只需要将 lambda 表达式传递给 OrderBy()
方法即可:
var sortedPeople = people.OrderBy(p => p.Name);
foreach (var person in sortedPeople) {
Console.WriteLine($"{person.Name} ({person.Age})");
}
这将输出:
Alice (25)
Bob (20)
Charlie (30)
有时候,我们的排序需求可能更加复杂,需要按照一定的逻辑进行排序。这时候,我们可以使用 OrderBy()
方法的重载版本,它接受一个 IComparer<T>
对象,用于自定义排序逻辑。
假设我们要按照以下逻辑进行排序:
下面是如何实现:
public class CustomComparer : IComparer<Person> {
public int Compare(Person x, Person y) {
// 年龄小于 20 的人排在最前面
if (x.Age < 20 && y.Age < 20) {
return 0;
} else if (x.Age < 20) {
return -1;
} else if (y.Age < 20) {
return 1;
}
// 年龄在 20~30 之间的人按照姓名字典序排序
if (x.Age >= 20 && x.Age <= 30 && y.Age >= 20 && y.Age <= 30) {
return x.Name.CompareTo(y.Name);
}
// 年龄大于 30 的人按照年龄倒序排序
if (x.Age > 30 && y.Age > 30) {
return y.Age.CompareTo(x.Age);
} else if (x.Age > 30) {
return -1;
} else if (y.Age > 30) {
return 1;
}
return 0;
}
}
// 使用自定义 comparer 进行排序
var sortedPeople = people.OrderBy(p => p, new CustomComparer());
foreach (var person in sortedPeople) {
Console.WriteLine($"{person.Name} ({person.Age})");
}
这将输出:
Bob (20)
Alice (25)
Charlie (30)
我们首先实现了一个实现了 IComparer<Person>
接口的类 CustomComparer,它定义了自定义的排序逻辑。然后,在调用 OrderBy()
方法时,我们传递了 new CustomComparer()
作为第二个参数,以使用自定义的 comparer 进行排序。