我有一个名为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
答案 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接口不是 IComparable
。
IComparable
用于排序目的
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 与 ?三元运算符。