如何使用LINQ对Person列表先按Role排序再按字母顺序排序?
实现按Role优先级+Name字母顺序的LINQ排序
没问题,要达成你想要的排序效果——先让所有Teacher连续排列在最前面,再在同角色组内按Name字母顺序排序,用LINQ的排序方法组合就能轻松实现,下面分两种场景给你解决方案:
基础场景:仅需Teacher优先排序
如果你的需求只有Teacher需要排在最前面,其他角色顺序无所谓,直接用OrderBy配合条件判断,再跟上ThenBy做二次排序即可:
var sortedPersons = persons .OrderBy(p => p.Role != "Teacher") // 让Teacher排在最前面:false(是Teacher)会排在true(非Teacher)之前 .ThenBy(p => p.Name); // 同角色内按Name字母升序排序
完整代码示例
把排序逻辑整合到你的代码里,验证效果:
class Program { class Person { public Person(string id, string name, string role) { Id = id; Name = name; Role = role; // 注意:原代码漏给Role赋值,这里补上 } public string Id { get; set; } public string Name { get; set; } public string Role { get; set; } // 原代码缺失的Role属性,是按Role排序的必要条件 } static void Main() { List<Person> persons = new List<Person>(); persons.Add(new Person("P005", "Janson", "Teacher")); persons.Add(new Person("P137", "Aniket", "Student")); persons.Add(new Person("P002", "Aravind", "Teacher")); persons.Add(new Person("P007", "Kazhal", "Student")); persons.Add(new Person("P017", "Kamikaze", "Teacher")); persons.Add(new Person("P417", "Johnson", "Teacher")); // 执行排序 var sortedPersons = persons .OrderBy(p => p.Role != "Teacher") .ThenBy(p => p.Name); // 输出排序结果 foreach (var person in sortedPersons) { Console.WriteLine($"Role: {person.Role}, Name: {person.Name}, Id: {person.Id}"); } } }
小提示:原代码里
Person类的构造函数没有给Role属性赋值,也没定义Role的公共属性,我已经补上了,这是按Role排序的前提哦。
扩展场景:多角色优先级排序
如果之后需要给更多角色设置排序优先级(比如Admin要排在Teacher前面,Student在最后),可以用字典定义权重,这样扩展性更强:
// 定义角色优先级:数值越小,排序越靠前 var rolePriority = new Dictionary<string, int> { {"Admin", 1}, {"Teacher", 2}, {"Student", 3} }; var sortedPersons = persons .OrderBy(p => rolePriority.TryGetValue(p.Role, out int priority) ? priority : int.MaxValue) .ThenBy(p => p.Name);
这样不管后续新增多少角色,只需要修改字典里的优先级数值就可以了,非常灵活。
内容的提问来源于stack exchange,提问作者casillas
相关产品推荐
相关产品推荐

