可比性.比较与排序中的空进行比较
本文关键字:比较 可比性 排序 | 更新日期: 2023-09-27 17:56:15
我想在IComparable<T>.CompareTo
的帮助下对名为Path
的类型T
的列表进行排序。我写了
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
调用。我更惊讶的是,在第一个代码块中,抛出了第二个异常,这意味着shortest
在排序之后而不是之前包含一个 null 值。
您的CompareTo
函数已损坏。当一个对象与自身进行比较时,它不会返回0
,当比较两个具有valid == false
的对象时,它总是返回1
。因此,可能有两个对象a
和b
具有a.CompareTo(b) == 1
和b.CompareTo(a) == 1
,这可能会导致Sort()
行为异常。
此外,正如另一个答案中已经指出的,如果other == null
,它应该返回1
。(当列表不包含null
时,应该无关紧要)
虽然我无法解释为什么 Sort 需要与 null 进行比较,但 IComparable.CompareTo 的文档明确指出:
根据定义,任何对象的比较都大于(或跟随)null,并且两个 null 引用相互比较相等。
因此,无论原因是什么,CompareTo 的实现都必须遵循此规则和其他规则,以确保与 Sort() 等人的兼容性。