我希望在IComparable<T>.CompareTo
的帮助下为名为T
的{{1}}类型对列表进行排序。我写了
Path
令我惊讶的是,方法
var shortest = new List<Path>();
//Fill shortest with elements != null
if (shortest.Contains(null))
throw new System.Exception("Path is null");
shortest.Sort();
if (shortest.Contains(null))
throw new System.Exception("Path is null");
来自班级
int IComparable<Path>.CompareTo(Path other)
{
if (other == null)
return -1;
if (!other.valid)
return 1;
if (pfad.Count() > other.pfad.Count())
{
return -1;
}
else if (pfad.Count() < other.pfad.Count())
{
return 1;
}
else
{
if (length > other.length)
return -1;
else
return 1;
}
}
从 public class Path : IComparable<Path>
Sort()
调用。我更惊讶的是,在第一个代码块中,抛出了第二个异常,这意味着other==null
在排序之后包含空值而不是之前。
答案 0 :(得分:1)
虽然我无法解释为什么Sort需要与null进行比较,但IComparable.CompareTo的documentation明确指出:
根据定义,任何对象都比较大于(或跟随)null,并且两个空引用相互比较相等。
因此,无论原因是什么,CompareTo的实现必须遵循这个和其他规则以确保与Sort()等的兼容性。
答案 1 :(得分:1)
您的CompareTo
功能已损坏。当一个对象与自身进行比较时,它不返回0
,当比较两个带有1
的对象时,它总是返回valid == false
。因此,可能有两个对象a
和b
与a.CompareTo(b) == 1
和b.CompareTo(a) == 1
,这可能会导致Sort()
行为奇怪。
另外,正如在另一个答案中已经提到的那样,如果1
,它应该返回other == null
。 (当列表不包含null
)