高效地根据特定属性对对象列表进行排序是任何 C# 开发人员都必须掌握的关键技能。本文探讨两种主要方法:利用 LINQ 的 `OrderBy` 方法和利用 `List.Sort` 方法以及委托。我们将研究每种方法的优缺点,帮助您根据自己的具体需求选择最佳方法。
目录
使用 LINQ 的 `OrderBy` 方法
LINQ 的 `OrderBy` 方法提供了一种简洁易读的列表排序方法。它使用 lambda 表达式指定排序条件,并返回一个新的已排序列表,原始列表保持不变。当您需要保留原始数据时,这是理想的选择。
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
}
public class Example
{
public static void Main(string[] args)
{
List<Person> people = new List<Person>()
{
new Person { Name = "Alice", Age = 30 },
new Person { Name = "Bob", Age = 25 },
new Person { Name = "Charlie", Age = 35 }
};
// 按名称排序(升序)
var sortedByName = people.OrderBy(p => p.Name).ToList();
Console.WriteLine("按名称排序:");
PrintPeople(sortedByName);
// 按年龄排序(降序)
var sortedByAgeDescending = people.OrderByDescending(p => p.Age).ToList();
Console.WriteLine("n按年龄排序(降序):");
PrintPeople(sortedByAgeDescending);
}
static void PrintPeople(List<Person> people)
{
foreach (var person in people)
{
Console.WriteLine($"{person.Name}, {person.Age}");
}
}
}
使用委托和 `List<T>.Sort`
对于需要更多控制或需要重用排序逻辑的情况,委托提供了一种强大的替代方案。`List<T>.Sort` 方法就地排序列表,直接修改原始列表。对于非常大的列表,这可能更高效,但请记住它会更改原始数据。
using System;
using System.Collections.Generic;
// ... Person 类(如上) ...
public class Example
{
public static void Main(string[] args)
{
List<Person> people = new List<Person>()
{
new Person { Name = "Alice", Age = 30 },
new Person { Name = "Bob", Age = 25 },
new Person { Name = "Charlie", Age = 35 }
};
// 使用委托按名称排序(升序)
people.Sort((p1, p2) => p1.Name.CompareTo(p2.Name));
Console.WriteLine("按名称排序(就地):");
PrintPeople(people);
// 使用委托按年龄排序(降序)
people.Sort((p1, p2) => p2.Age.CompareTo(p1.Age)); // 注意降序的顺序反转
Console.WriteLine("n按年龄排序(降序,就地):");
PrintPeople(people);
}
// ... PrintPeople 方法(如上) ...
}
选择正确的方法
最佳方法取决于您的具体需求:
- `OrderBy` (LINQ): 对于需要保留原始列表的简单排序任务是理想的选择。它通常更易读。
- `List<T>.Sort` (使用委托): 提供更大的控制,并且当可以修改原始列表时,对于非常大的列表可能更高效。对于复杂的比较逻辑或可重用的排序函数很有用。
在做出选择之前,请仔细考虑您是否需要维护原始列表的顺序以及应用程序的性能影响。