IComparable <t> .CompareTo与Sort </t>中的null进行比较

时间:2013-01-28 14:48:21

标签: c# sorting compareto icomparable

我希望在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在排序之后包含空值而不是之前。

2 个答案:

答案 0 :(得分:1)

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

  

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

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

答案 1 :(得分:1)

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

另外,正如在另一个答案中已经提到的那样,如果1,它应该返回other == null。 (当列表不包含null

时,这应该不重要