C#面试题更新 2026-08-03

在 C# 编程中,若要对 List 集合进行排序,可以采用哪些方式利用自定义比较器来实现?请说明具体步骤与关键接口或方法。

考察说明

考查对 C# List 排序机制及自定义比较器实现的掌握程度。

回答思路

  1. 【回答框架 1】List<T> 排序可通过 Sort 方法重载实现,其中接受 Comparison<T> 委托或 IComparer<T> 接口参数。自定义比较器需实现 IComparer<T> 接口,其 Compare 方法返回 int,定义两个元素的相对顺序。
  2. 【回答框架 2】使用 Comparison<T> 委托更简洁,可直接传入 lambda 表达式或方法组,例如 list.Sort((x, y) => x.某属性.CompareTo(y.某属性)),无需单独定义类。
  3. 【回答框架 3】若需按多个条件排序,可在 Compare 方法中依次比较各字段,或利用 LINQ 的 OrderBy 与 ThenBy 链式操作,但注意 Sort 是原地排序,LINQ 返回新序列。
  4. 【回答框架 4】实现 IComparer<T> 时需保证比较器一致性,即 Compare(a,b) 与 Compare(b,a) 符号相反,且传递性成立,否则排序结果不确定。
  5. 【回答框架 5】排序稳定性方面,List<T>.Sort 使用快速排序算法,不稳定;若需稳定排序,可使用 LINQ 的 OrderBy,其内部采用稳定排序。
  6. 【关键点 1】自定义比较器需实现 IComparer<T> 接口或使用 Comparison<T> 委托。
  7. 【关键点 2】Sort 方法原地排序,不稳定;OrderBy 返回新序列且稳定。
  8. 【关键点 3】比较器必须满足自反性、反对称性和传递性。
  9. 【易错点 1】忽略比较器一致性可能导致排序结果异常或抛出异常。
  10. 【易错点 2】使用 Sort 时误以为稳定,其实不稳定,影响相同元素的相对顺序。
  11. 【易错点 3】比较 null 元素时需额外处理,否则可能引发 NullReferenceException。