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;
}