C#-定制IComparer<;T>;它接受一个参数作为输入
我有一个点列表(x,y),我想根据它们相对于参考点的极角来排序,我计算为列表中所有点的平均点。 如何设置IComparer,以便将参考点传递给它以计算极角?您有两个选项 选项A 参考点必须是C#-定制IComparer<;T>;它接受一个参数作为输入,c#,icomparer,C#,Icomparer,我有一个点列表(x,y),我想根据它们相对于参考点的极角来排序,我计算为列表中所有点的平均点。 如何设置IComparer,以便将参考点传递给它以计算极角?您有两个选项 选项A 参考点必须是点对象的一部分。因此,在您的点的比较方法中,您可以考虑计算角度并比较对象 public int IComparer.Compare(Point x, Point y) { var angleX = Utilities.CalculateAngle(x.ReferencePoint); var ang
点
对象的一部分。因此,在您的点
的比较方法中,您可以考虑计算角度并比较对象
public int IComparer.Compare(Point x, Point y) {
var angleX = Utilities.CalculateAngle(x.ReferencePoint);
var angleY = Utilities.CalculateAngle(y.ReferencePoint);
if (angleX < angleY) return -1;
if (angleX == angleY) return 0;
if (angleX > angleY) return 1;
// Or simply "return angleX - angleY;"
}
你有两个选择
选项A
参考点必须是点
对象的一部分。因此,在您的点
的比较方法中,您可以考虑计算角度并比较对象
public int IComparer.Compare(Point x, Point y) {
var angleX = Utilities.CalculateAngle(x.ReferencePoint);
var angleY = Utilities.CalculateAngle(y.ReferencePoint);
if (angleX < angleY) return -1;
if (angleX == angleY) return 0;
if (angleX > angleY) return 1;
// Or simply "return angleX - angleY;"
}
您可以提前计算参考点,并将其传递给
i比较程序的构造函数
:
class PointComparer : IComparer<Point>
{
private readonly Point referencePoint;
public PointComparer(Point referencePoint)
{
this.referencePoint = referencePoint;
}
public Int32 Compare(Point x, Point y)
{
// Compare using referencePoint
}
}
我使用了
OrderyBy
和notSort
,因为当我们参考文档时,后者被认为不是一个稳定的排序。您可以提前计算参考点,并将其传递给IComparer
的构造函数:
class PointComparer : IComparer<Point>
{
private readonly Point referencePoint;
public PointComparer(Point referencePoint)
{
this.referencePoint = referencePoint;
}
public Int32 Compare(Point x, Point y)
{
// Compare using referencePoint
}
}
我使用了
OrderyBy
和notSort
,因为当我们参考文档时,后者被认为不是一种稳定的排序。您的选项aIComparer.Compare
会导致编译错误,因为不是每个路径都返回值.k,那么只需返回角度x-angleY
,正如我在CodeAngle中所评论的,angle不应该是某种浮点类型吗?好吧,它们中没有一个隐式转换为int
。所以,这里仍然有错误。我没有认真考虑,这更像是一个伪错误-code@PetSerAl最好的选择是returnanglex.CompareTo(angleY)代码>。它同时适用于int
、float
和double
(以及更多)。即使在int
的情况下,如果存在Hristo Yankov建议的减法风险,可能会溢出(超过int.MaxValue
的差值可能会变为负值,对于MinValue
也会变为负值)。在语义上或“逻辑上”它也表达了我们想要的内容。您的选项AIComparer.Compare
会导致编译错误,因为不是每个路径都返回值.k,那么只返回angleX-angleY
,正如我在CodeAngle中所评论的,angle不应该是某种浮点类型吗?好吧,它们中没有一个隐式转换为int
。所以,这里仍然有错误。我没有认真考虑,这更像是一个伪错误-code@PetSerAl最好的选择是returnanglex.CompareTo(angleY)代码>。它同时适用于int
、float
和double
(以及更多)。即使在int
的情况下,如果存在Hristo Yankov建议的减法风险,可能会溢出(超过int.MaxValue
的差值可能会变为负值,对于MinValue
也会变为负值)。也可以在语义上或“逻辑上”表示我们想要的内容。您还可以从类类型比较器派生。您仍然需要一个Compare(Point,Point)
方法(这次是一个重写继承自基类的abstract
方法),但优点是您可以同时获得对IComparer
和旧的非泛型IComparer
的支持,您也可以跳过自定义类,只捕获(关闭)比较中的引用点。这将是myList.OrderBy(x=>/*表达式包含x和calculatedReferencePoint*/)
。如果您确实需要比较器,可以使用Create
,如comparer.Create(x=>/*表达式包含x和calculatedReferencePoint*/)
,同样无需自己编写自定义类。您也可以从类类型比较器中派生。您仍然需要一个Compare(Point,Point)
方法(这次是一个重写继承自基类的abstract
方法),但优点是您可以同时获得对IComparer
和旧的非泛型IComparer
的支持,您也可以跳过自定义类,只捕获(关闭)比较中的引用点。这将是myList.OrderBy(x=>/*表达式包含x和calculatedReferencePoint*/)
。如果您确实需要比较器,可以使用Create
,如comparer.Create(x=>/*表达式包含x和calculatedReferencePoint*/)
,同样无需自己编写自定义类。