Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/262.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#-定制IComparer<;T>;它接受一个参数作为输入_C#_Icomparer - Fatal编程技术网

C#-定制IComparer<;T>;它接受一个参数作为输入

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

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

您有两个选项

选项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;"
}
你有两个选择

选项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
和not
Sort
,因为当我们参考文档时,后者被认为不是一个稳定的排序。

您可以提前计算参考点,并将其传递给
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
和not
Sort
,因为当我们参考文档时,后者被认为不是一种稳定的排序。

您的选项a
IComparer.Compare
会导致编译错误,因为不是每个路径都返回值.k,那么只需
返回角度x-angleY
,正如我在CodeAngle中所评论的,angle不应该是某种浮点类型吗?好吧,它们中没有一个隐式转换为
int
。所以,这里仍然有错误。我没有认真考虑,这更像是一个伪错误-code@PetSerAl最好的选择是
returnanglex.CompareTo(angleY)。它同时适用于
int
float
double
(以及更多)。即使在
int
的情况下,如果存在Hristo Yankov建议的减法风险,可能会溢出(超过
int.MaxValue
的差值可能会变为负值,对于
MinValue
也会变为负值)。在语义上或“逻辑上”它也表达了我们想要的内容。您的选项A
IComparer.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*/)
,同样无需自己编写自定义类。