C#中的IC可比较

时间:2013-08-06 05:31:20

标签: c# comparison compare icomparable

我有一个名为Shape的对象,其中包含public int[,] coordinate { get; set; }字段。

我有一个单独的类,其中包含Shape个对象的集合。在某一点上,我想检查一下:

if(shapes.Contains(shape))
{
   // DoSomething
}

因此,在Shape课程中,我添加了IComparable引用并插入了CompareTo方法:

public int CompareTo(Shape other)
{
    return this.coordinate.Equals(other.coordinate);
}

然而我收到了错误:

Cannot implicitly convert type 'bool' to 'int'

因此,我如何对返回进行短语,以便它返回一个int而不是bool,因为它正在这样做?

更新

如果我将返回代码更改为:

return this.coordinate.CompareTo(other.coordinate);

我收到以下错误消息:

  

错误1'ShapeD.Game_Objects.Shape'未实现接口成员'System.IComparable.CompareTo(ShapeD.Game_Objects.Shape)'。 'ShapeD.Game_Objects.Shape.CompareTo(ShapeD.Game_Objects.Shape)'无法实现'System.IComparable.CompareTo(ShapeD.Game_Objects.Shape)',因为它没有匹配的返回类型'int'。 C:\ Users \ Usmaan \ Documents \ Visual Studio 2012 \ Projects \ ShapeD \ ShapeD \ ShapeD \ Game Objects \ Shape.cs 10 18 ShapeD

4 个答案:

答案 0 :(得分:3)

IComparable暗示,在某种意义上可以比较两个对象,即可以判断哪个对象具有“更高的值”。它通常用于分类目的。您应该覆盖Equals方法。您还应该使用Point结构而不是数组。

class Shape : IEquatable<Shape>
{
    public Point coordinate { get; set; }

    public bool Equals(Shape other)
    {
        if (other == null) return false;
        return coordinate.Equals(other.coordinate);
    }

    public override bool Equals(object other)
    {
        if (other == null) return false;
        if (ReferenceEquals(this, other)) return true;
        var shape = other as Shape;
        return Equals(shape);
    }

    public override int GetHashCode()
    {
        return coordinate.X ^ coordinate.Y;
    }
}

答案 1 :(得分:3)

由于您只想检查等同实现IEquatable接口不是 IComparableIComparable用于排序目的

public bool Equals(Shape s)
{

    int count=0;
    int[] temp1=new int[this.coordinate.Length];
    foreach(int x in this.coordinate)temp1[count++]=x;//convert to single dimention

    count=0;
    int[] temp2=new int[s.coordinate.Length];
    foreach(int x in s.coordinate)temp2[count++]=x;//convert to single dimention

    return temp1.SequenceEqual(temp2);//check if they are equal

}

注意

IEquatable应针对可能存储在generic集合其他中的任何对象实施,您还必须覆盖对象的Equals方法。也可以在其他使用Point结构而不是多维数组

中指出

答案 2 :(得分:2)

对于执行包含检查,您需要在Shape类中重写Equals运算符。

答案 3 :(得分:0)

重新提出一个旧问题只是因为它仍然会导致谷歌点击,尽管有些答案非常糟糕。 您不应该使用 CompareTo 或 Equals。 这些都不适合您尝试做的事情,只会引起混乱,正如此处所写的答案所证明的那样。 编写自己的方法,称为 IntersectsWith 之类的方法。 看看任何像样的几何库(例如,如果你很高兴从 C++ 中提取,则提升)以了解如何执行此操作。 至于从 bool 到 int 的转换,这可以通过将 bool 与 ?三元运算符。