如何使用Comparison委托对类的String属性排序?代码异常求助
解决Comparison委托实现Student姓名排序失效的问题
你遇到的排序失效问题,核心原因是CompareNames方法里的比较逻辑写错啦!
问题定位
看你写的比较方法:
public static int CompareNames(student std1, student std2) { return std1.name.CompareTo(std1.name); }
这里你把std1.name和它自己做比较,返回值永远是0(表示两个对象相等),所以List调用Sort后根本不会调整元素顺序,自然达不到按姓名字母序排序的效果。
修正方案
只需要把比较的对象改成std2.name就可以解决:
public static int CompareNames(student std1, student std2) { return std1.name.CompareTo(std2.name); }
更简洁的写法(可选)
其实没必要单独写一个方法,直接用Lambda表达式创建Comparison委托会更简洁,代码更紧凑:
// 直接在Sort方法中传入Lambda表达式,省去中间委托变量 studentList.Sort((std1, std2) => std1.name.CompareTo(std2.name));
额外小建议
- 遵循C#命名规范:类名和属性名建议用大驼峰(比如把
student改成Student,name改成Name),这样代码可读性更高。 - 如果需要不区分大小写的排序,可以用
string.Compare方法替代CompareTo:studentList.Sort((std1, std2) => string.Compare(std1.name, std2.name, StringComparison.OrdinalIgnoreCase));
修正后的完整代码示例:
using System; using System.Collections.Generic; namespace comparisionProject { public class Student { public int SId { get; set; } public string Name { get; set; } public int FullMarks { get; set; } = 600; public int Marks { get; set; } } public class Tester { static void Main(string[] args) { Student s1 = new Student(){SId=101 , Name = "kalu",Marks = 456 }; Student s2 = new Student(){SId = 102, Name = "balu", Marks = 562}; Student s3 = new Student(){SId = 103, Name= "golu", Marks = 432}; Student s4 = new Student(){SId = 104, Name= "aalu", Marks = 432}; List<Student> studentList = new List<Student>(){s1,s2,s3,s4}; // 使用Lambda表达式实现排序 studentList.Sort((std1, std2) => std1.Name.CompareTo(std2.Name)); foreach (Student item in studentList) { Console.WriteLine($"{item.SId} {item.Name} {item.FullMarks} {item.Marks}"); } } } }
运行后就能得到按姓名字母序排列的结果:aalu、balu、golu、kalu,完全符合你的预期。
内容的提问来源于stack exchange,提问作者sikka karma
相关产品推荐
相关产品推荐

