我有一个点(x,y)的列表,我想根据它们的极角对一个参考点进行排序,我计算它是列表中所有点的平均值。如何设置IComparer以便将参考点传递给它来计算极角?
发布于 2017-01-29 10:49:44
您可以提前计算参考点,并将其传递给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
}
}用法:
var ordered = myList.OrderBy(x => x, new PointComparer(calculatedReferencePoint));我使用的是OrderyBy,而不是Sort,因为当我们引用文档时,后者被认为不是一个稳定的类型。
发布于 2017-01-29 10:44:31
你有两个选择。
选项A
引用点必须是Point对象的一部分。所以在你的Point比较方法中,你可以考虑它来计算角度和比较物体。
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;"
}选项B
在您的观点中,应该已经计算出了Angle。使Point成为一个不变的结构,并计算结构实例化时的角度。那就OrderBy那个属性。
即
public struct Point
{
public double Angle { get; private set; }
public Point(double referencePoint, double x, double y)
{
// TODO: Calculate Angle
}
}
points.OrderBy(p => p.Angle);https://stackoverflow.com/questions/41919953
复制相似问题