2010-11-22 5 views
1

점의 집합 (PointCollection)이 있다고 가정합시다. 내가 원하는 것은이 포인트들 중에서 X와 Y 좌표의 최소값을 찾는 것입니다. 분명히 컬렉션을 반복하고 좌표를 단계별로 확인할 수 있습니다.PointCollection (C#)의 X 및 Y 좌표의 최소값

더 빠르고 효율적인 솔루션이 있는지 궁금합니다.

의견이 있으십니까?

감사합니다.

+1

그래서 2 점을 원하십니까? 가장 낮은 X와 가장 낮은 Y 또는 가장 낮은 결합 된 X와 Y를 가진 하나? –

+0

이미 정렬되지 않은 한 모두를 검사하는 것보다 빠릅니다. – smirkingman

답변

4

더 빠르게 입력 하시겠습니까? 아마도 :

var xMin = points.Min(p => p.X); 
var yMin = points.Min(p => p.Y); 

하지만 그 하나의 foreach 루프보다 느리게 실행됩니다 : 당신이 원하는 경우

var lowestX = pointCollection.Min(p => p.X); 
var lowestY = pointCollection.Min(p => p.Y); 

를 사용

bool first = true; 
foreach(var point in points) { 
    if(first) { 
     xMin = point.X; 
     yMin = point.Y; 
     first = false; 
    } else { 
     if(point.X < xMin) xMin = point.X; 
     if(point.Y < yMin) yMin = point.Y; 
    } 
} 
+0

가장 빠른 솔루션을 찾고 있습니다. 첫 번째 것이 더 느릴 것이라고 생각한 이유는 무엇입니까? – Jamie

+1

또한이 코드는 매번 필요가 없다면이 코드는 xmin과 ymin을 int.MaxValue에 할당 한 다음 foreach를 사용하면 body가 그냥 else 블록이됩니다. –

+1

@HPT - 좋습니다. @Jamie : 왜냐하면 a : it은 한 번이 아닌 두 번 반복되고, b : LINQ는 최소 공통 분모 접근법에서 작동합니다. 컬렉션 유형에 대해 정의 된 사용자 지정 반복자를 사용할 수 없으며 추가 대리자 호출을 수행해야합니다. –

1

는 별도로 가장 낮은 x와 y 위치를 얻으려면 가장 낮은 결합 된 X 및 Y 위치를 가진 것이 사용

var lowest = pointCollection.Min(p => p.X + p.Y); 
+0

'Min'은'Point'가 아닙니다 ... –

+0

Ops. 내 대답에 고정. –