实现IComparable<string>时,MyComparer类访问Length报错如何解决?
解决IComparable实现中无法访问Length的问题
兄弟,你这段代码跑不起来的核心原因很明确:你在CompareTo方法里用this.Length,但this指的是MyComparer类的实例,而你并没有给这个类定义Length成员——毕竟它不是字符串类型嘛!
接下来分两种场景给你修正方案,你根据自己的实际需求选:
场景1:你的MyComparer类本身是一个可与string比较的对象
如果你的需求是让MyComparer的实例能和外部传入的string做比较(比如类内部持有一个字符串,要和传入的string比长度),那你需要给类添加一个字符串属性,然后访问这个属性的Length:
class MyComparer : IComparable<string> { // 添加一个字符串属性,用来作为比较的基准 public string TargetString { get; set; } public int CompareTo(string second) { // 先处理传入参数为null的情况,避免空引用异常 if (second == null) return 1; // 按照约定,非null对象优先级高于null // 现在访问自身属性的Length,和传入string的Length做差值 int lengthDiff = TargetString.Length - second.Length; // 如果长度相同,再按字符串内容排序 return lengthDiff == 0 ? string.Compare(TargetString, second) : lengthDiff; } }
场景2:你其实想做一个字符串比较器(比较两个string)
如果你的真实需求是定义一套比较两个string的逻辑(比如先比长度再比内容),那你应该实现IComparer<string>接口,而不是IComparable<string>——前者是用来比较两个同类型对象的比较器,后者是让当前类实例能和另一个类型对象比较:
class MyComparer : IComparer<string> { public int Compare(string first, string second) { // 处理各种null情况 if (first == null && second == null) return 0; if (first == null) return -1; if (second == null) return 1; // 先比较长度,长度相同再比较字符串内容 int lengthDiff = first.Length - second.Length; return lengthDiff == 0 ? string.Compare(first, second) : lengthDiff; } }
内容的提问来源于stack exchange,提问作者Yas
相关产品推荐
相关产品推荐

