首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C# -使用参数作为输入的自定义IComparer<T>

C# -使用参数作为输入的自定义IComparer<T>
EN

Stack Overflow用户
提问于 2017-01-29 10:37:34
回答 2查看 629关注 0票数 0

我有一个点(x,y)的列表,我想根据它们的极角对一个参考点进行排序,我计算它是列表中所有点的平均值。如何设置IComparer以便将参考点传递给它来计算极角?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-01-29 10:49:44

您可以提前计算参考点,并将其传递给IComparer的构造函数。

代码语言:javascript
复制
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
    }
}

用法:

代码语言:javascript
复制
var ordered = myList.OrderBy(x => x, new PointComparer(calculatedReferencePoint));

我使用的是OrderyBy,而不是Sort,因为当我们引用文档时,后者被认为不是一个稳定的类型。

票数 3
EN

Stack Overflow用户

发布于 2017-01-29 10:44:31

你有两个选择。

选项A

引用点必须是Point对象的一部分。所以在你的Point比较方法中,你可以考虑它来计算角度和比较物体。

代码语言:javascript
复制
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那个属性。

代码语言:javascript
复制
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);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41919953

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档