如果有争议地比较.net中的orderedIntructure删除变量吗?

时间:2014-04-29 10:57:41

标签: .net

#pragma strict
public class TEffectComparator implements IComparer
{
    public function TEffectComparator()
    {

    }
    public function Compare (f:Object,s:Object)
    {

        if(f.type>s.type)
            return 1;
        else if(f.type<s.type)
            return -1;
        return 1; //Will it cause errors?
    }
}

我想实现优先级队列。

我不想实现特殊的ID属性。

如果我的比较函数每次当两个对象相等时返回1,它会导致错误吗?

1 个答案:

答案 0 :(得分:2)

可能。

在实现IComparer(通用或非通用)时签署的隐式契约是您根据约定行事,即不应为相等元素返回1。

Documentation: IComparer.Compare

  

小于零意味着x小于y   零表示x等于y   大于零意味着x大于y。

如果您使用的是从x或y中无法获得的知识,那么您将面临不一致的排序风险。

具体来说,.NET中的不同排序实现可能会被优化,如果已经“知道”结果,则不会向comparer对象询问每个比较。

另请注意,比较器应该是自反和对称的,这意味着以下测试应该通过:

  1. compare(x, y) == 0隐含compare(y, x) == 0,反之亦然
  2. compare(x, y) < 0表示compare(y, x) > 0,与
  3. 相对
  4. compare(x, y) < 0compare(y, z) < 0表示compare(x, z) < 0
  5. 您的实施至少失败了。 2,根据您比较的顺序,它将失败nbr。 3。

    所以它可能不是错误,因为它会引发异常。它可能,但它可能不会。但是,它可能不会以任何有意义的方式对集合进行排序。

    在您的特定情况下,如果询问比较器对象a是否在对象b之前,并且根据您的规则它们看起来相等,则您将返回1(表示a之前的b)。然后,无论出于何种原因,代码会询问您的比较器对象b是否在对象a之前,并且它们仍然相等,您仍然返回1(意味着在b之前),您将得到不一致结果