7

我有一个名为的对象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'

因此,我该如何表述 return 以便它返回一个 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

4 回答 4

2

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.GetHashCode()
    }
}
于 2013-08-06T06:02:59.527 回答
2

由于您只想检查是否相等,因此请实施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结构而不是多维数组

于 2013-08-06T06:06:00.227 回答
1

要执行包含检查,您需要覆盖 Shape 类中的 Equals 运算符。

于 2013-08-06T05:52:27.280 回答
0

复活一个老问题只是因为它仍然可以导致谷歌点击,尽管一些非常糟糕的答案。您不应该使用 CompareTo 或 Equals。这些都不适合您尝试做的事情,只会引起混乱,正如这里写的答案所证明的那样。编写您自己的方法,称为 IntersectsWith。看看任何像样的几何库(例如,如果你很高兴从 c++ 中提取,则提升)作为如何去做。至于从 bool 到 int 的转换,这可以通过使用带有 ? 的 bool 轻松完成。三元运算符。

于 2021-03-15T04:57:44.177 回答