C#List.Sort不';t排序

C#List.Sort不';t排序,c#,sorting,C#,Sorting,我有一个列表我想排序,所以我使用了List.sort(Comparison)。我的代码没有按预期工作,经过一些调试后,我发现虽然其中包含的项目的顺序确实发生了变化,但它没有被排序。 代码如下: System.Comparison<Intersection> comp=(Intersection one, Intersection other)=>{//Sort sorts from lowest to highest if(one.index>other.inde

我有一个
列表
我想排序,所以我使用了
List.sort(Comparison)
。我的代码没有按预期工作,经过一些调试后,我发现虽然其中包含的项目的顺序确实发生了变化,但它没有被排序。
代码如下:

System.Comparison<Intersection> comp=(Intersection one, Intersection other)=>{//Sort sorts from lowest to highest
    if(one.index>other.index){
        return 1;
    }
    else if(one.index<other.index){
        return -1;
    }
    else if((one.point-one.node.position).sqrMagnitude>(other.point-other.node.position).sqrMagnitude){
        return 1;
    }
    else{
        return -1;
    }
};
intersections.Sort(comp);

正如其他人所指出的,您的比较函数从不返回零(相等)的结果,而是列表。当项目与自身进行比较时,排序依赖于比较函数返回相等的结果。

正如其他人所指出的,您的比较函数从不返回零(相等)的结果,但是,当项目与自身进行比较时,List.Sort依赖于比较函数返回相等值。

要扩展500内部服务器错误的(正确)答案,快速排序需要一个性能良好的比较函数。您需要提供以下比较:

  • 是自反性的:项目必须与自身进行比较
  • 在不等式中是反对称的:如果A大于B,那么B必须小于A
  • 在等式中是对称的:如果A等于B,那么B必须也等于A
  • 是可传递的:如果A等于B,B等于C,那么A必须等于C。如果A大于B,B大于C,那么A必须大于C。依此类推
简言之,必须提供一个有效的解决方案。您的比较算法违反了许多这些要求。任何时候你不能提供一个总的订购关系,坏事就会发生。算法可能崩溃,可能进入无限循环,也可能返回未排序的列表

有关更长时间的讨论,请参阅我编写的关于常见方法的四部分系列文章,这些方法是我看到的不正确的比较算法:


要扩展500个内部服务器错误(正确)答案,快速排序需要一个性能良好的比较函数。您需要提供以下比较:

  • 是自反性的:项目必须与自身进行比较
  • 在不等式中是反对称的:如果A大于B,那么B必须小于A
  • 在等式中是对称的:如果A等于B,那么B必须也等于A
  • 是可传递的:如果A等于B,B等于C,那么A必须等于C。如果A大于B,B大于C,那么A必须大于C。依此类推
简言之,必须提供一个有效的解决方案。您的比较算法违反了许多这些要求。任何时候你不能提供一个完全的顺序关系,坏的事情可能发生。算法可能崩溃,可能进入无限循环,也可能返回未排序的列表

有关更长时间的讨论,请参阅我编写的关于常见方法的四部分系列文章,这些方法是我看到的不正确的比较算法:


我不知道您的输入是什么,但它们是否永远不相等(0)?相等的值如何?一个永远不会返回0的比较在我看来是不可靠的。你能提供一个简短但完整的程序来演示这个问题吗?(如果您只需比较一个属性就可以做到这一点,这将非常有帮助……)显示您试图排序的数据结构。@TOMEMIS:许多标准排序算法,例如快速排序,都会定期将项目与自身进行比较(当然,希望比较返回的<代码>相等)@ Tomeamis:考虑下面的排序算法,将其排序为降序:搜索第一对相邻元素A和B,使得A小于B;如果不存在这样的元素对,则终止,否则,交换它们并重新开始。这种排序在大列表上效率很低,但在小列表上效率很高,因此当已知列表很小时,可以使用它代替快速排序。当列表有两个元素,彼此相等,并且给出了一个比较函数,表示第一个相等的项小于第二个相等的项时,该算法会做什么?我不知道您的输入是什么,但它们永远不相等(0)?关于相等的值呢?一个永远不会返回0的比较在我看来是不可靠的。你能提供一个简短但完整的程序来演示这个问题吗?(如果您只需比较一个属性就可以做到这一点,这将非常有帮助……)显示您试图排序的数据结构。@TOMEMIS:许多标准排序算法,例如快速排序,都会定期将项目与自身进行比较(当然,希望比较返回的<代码>相等)@ Tomeamis:考虑下面的排序算法,将其排序为降序:搜索第一对相邻元素A和B,使得A小于B;如果不存在这样的元素对,则终止,否则,交换它们并重新开始。这种排序在大列表上效率很低,但在小列表上效率很高,因此当已知列表很小时,可以使用它代替快速排序。当列表有两个彼此相等的元素,并且给出一个比较函数,表示第一个相等的项小于第二个相等的项时,该算法会做什么?
for(int he=1; he<intersections.Count; he++){
    Debug.Log(comp(intersections[he-1], intersections[he]));
}
class Intersection{
    public PolyNode node;
    public int index;
    public Polygon poly;
    public Intersection sister;
    public bool is_out;
    public sbyte wallnum;
    public Vector2 point;
    public int list_index;
}