使用List<OwnObject>的Sort()自定义排序遇编译错误,求解决方案
问题原因及解决方案
你的编译错误核心原因是:List<OwnObject>.Sort()方法的重载参数不匹配——你传入的OwnObject.CompareTo是实例方法的方法组,但你调用的Sort(IComparer<OwnObject>)重载需要的是实现了IComparer<OwnObject>接口的对象,而非实例方法;同时,实例版CompareTo(来自IComparable<OwnObject>)的签名是int CompareTo(OwnObject other),无法直接匹配Comparison<OwnObject>委托的int(OwnObject, OwnObject)签名。
下面是几种可行的修正方案:
方案1:直接使用无参Sort(推荐)
既然你的OwnObject已经实现了IComparable<OwnObject>接口,List<T>.Sort()的无参重载会自动调用每个对象的CompareTo方法完成排序,无需额外传参:
// 假设yourObjectList是你的原始OwnObject集合 var sortedList = yourObjectList.ToList(); sortedList.Sort();
方案2:用Lambda包装CompareTo匹配Comparison委托
如果你需要显式指定排序逻辑(比如临时修改排序规则),可以用Lambda表达式将实例方法CompareTo包装成Comparison<OwnObject>委托:
sortedList.Sort((objA, objB) => objA.CompareTo(objB));
方案3:改用静态比较方法
把排序逻辑写成静态方法,让它的签名匹配Comparison<OwnObject>,就可以直接传方法组:
public class OwnObject { public string Name { get; set; } // 静态比较方法,参数为两个OwnObject实例 public static int CompareByName(OwnObject a, OwnObject b) { if (a == null && b == null) return 0; if (a == null) return -1; if (b == null) return 1; // 替换成你之前实现的自定义字符串排序逻辑 return YourCustomStringComparer.Compare(a.Name, b.Name); } }
调用时直接传静态方法的方法组:
sortedList.Sort(OwnObject.CompareByName);
方案4:实现IComparer接口
如果需要复用排序逻辑,或者需要多个不同的排序规则,可以单独实现IComparer<OwnObject>:
public class OwnObjectNameComparer : IComparer<OwnObject> { public int Compare(OwnObject x, OwnObject y) { if (x == null && y == null) return 0; if (x == null) return -1; if (y == null) return 1; // 替换成你的自定义字符串排序逻辑 return YourCustomStringComparer.Compare(x.Name, y.Name); } }
调用时传入该比较器的实例:
sortedList.Sort(new OwnObjectNameComparer());
内容的提问来源于stack exchange,提问作者Dominique
相关产品推荐
相关产品推荐

