2017-01-29 3 views

답변

3

즉, 당신은 시간을 앞서 기준점을 계산할 수와 IComparer의 생성자에 전달 : 나는 OrderyBy을 사용

var ordered = myList.OrderBy(x => x, new PointComparer(calculatedReferencePoint)); 

:

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 
    } 
} 

사용 후자는 죄수이기 때문에 Sort이 아닙니다. 문서를 참조 할 때 안정적인 분류가 아닙니다.

+0

정확히 내가 뭘 찾고 있었는지, 고마워! –

+0

또한 _class_ 유형'Comparer '에서 파생 될 수 있습니다. 'Compare (Point, Point)'메소드 (이번에는 기본 클래스에서 상속받은'abstract' 메소드의'override')가 필요 하겠지만, 장점은'IComparer '와 오래된 비 제너럴 IComparer. –

+0

'OrderBy'를 사용할 때, 커스텀 클래스를 건너 뛰어'Comparison '델리게이트 (lambda)에서 그 참조 점을 캡쳐 (닫기) 할 수 있습니다. 그것은 myList.OrderBy (x =>/* 표현식 x와 calculatedReferencePoint * /)'일 것입니다. 비교자를 정말로 필요로한다면'Comparer .Create (x =>/* expression with x and calculatedReferencePoint * /)'와 같이'Create'를 사용하여 얻을 수 있습니다. 다시 커스텀 클래스를 작성할 필요가 없습니다. –

1

두 가지 옵션이 있습니다.

옵션 A

기준점은 Point 개체의 일부 여야합니다. 따라서 Point의 Compare 메서드에서 각도를 계산하고 개체를 비교하는 데 고려해야합니다.

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); 
+0

** 옵션 ** IComparer.Compare는 모든 경로 반환 값이 아니기 때문에 컴파일 오류를 발생시킵니다. – PetSerAl

+0

k, 코드에서 주석 처리 한대로'return angleX - angleY;'그냥 –

+0

각도가 부동 소수점 형식이 아닌가요? AFAIK, 그들 중 누구도 암시 적으로 int로 변환하지 않습니다. 그래서, 당신은 여전히 ​​여기에 오류가 있습니다. – PetSerAl