可比性.比较与排序中的空进行比较

本文关键字:比较 可比性 排序 | 更新日期: 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 值。

可比性<T>.比较与排序中的空进行比较

您的CompareTo函数已损坏。当一个对象与自身进行比较时,它不会返回0,当比较两个具有valid == false的对象时,它总是返回1。因此,可能有两个对象ab具有a.CompareTo(b) == 1b.CompareTo(a) == 1,这可能会导致Sort()行为异常。

此外,正如另一个答案中已经指出的,如果other == null,它应该返回1。(当列表不包含null时,应该无关紧要)

虽然我无法解释为什么 Sort 需要与 null 进行比较,但 IComparable.CompareTo 的文档明确指出:

根据定义,任何对象的比较都大于(或跟随)null,并且两个 null 引用相互比较相等。

因此,无论原因是什么,CompareTo 的实现都必须遵循此规则和其他规则,以确保与 Sort() 等人的兼容性。