2

と呼ばれるIComparable<T>.CompareToタイプの助けを借りてリストをソートしたいと思います。私が書いたTPath

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番目の例外がスローさshortestれます。これは、並べ替えの前ではなく、並べ替えの後にnull値が含まれていることを意味します。

4

2 に答える 2

1

Sortがnullと比較する必要がある理由を説明することはできませんが、IComparable.CompareToのドキュメントには次のように明示的に記載されています。

定義上、どのオブジェクトもnullより大きい(または続く)比較を行い、2つのnull参照は互いに等しく比較されます。

そのため、理由が何であれ、CompareToの実装は、Sort()などとの互換性を確保するために、これと他のルールに従う必要があります。

于 2013-01-28T14:56:32.030 に答える
1

あなたのCompareTo機能は壊れています。0オブジェクトがそれ自体と比較された場合は返されません。また1、2つのオブジェクトが比較された場合は常に返されますvalid == false。したがって、2つのオブジェクトabwith a.CompareTo(b) == 1andが存在する可能性がありb.CompareTo(a) == 1、これによりSort()奇妙な動作が発生する可能性があります。

また、他の回答ですでに述べたように1other == null。(リストに含まれていない場合は、実際には問題になりませんnull

于 2013-01-28T15:24:46.017 に答える