2010-11-22 12 views
1

Nehmen wir an, ich habe eine Sammlung von Punkten (PointCollection). Was ich tun möchte, ist den minimalen Wert der X- und Y-Koordinaten zwischen diesen Punkten zu finden. Offensichtlich könnte man über die Sammlung iterieren und die Koordinaten Schritt für Schritt überprüfen.Minimale Werte von X- und Y-Koordinaten in PointCollection (C#)

Ich frage mich, ob es eine schnellere und effizientere Lösung gibt.

Haben Sie irgendwelche Ideen?

Danke

+1

Sie wollen also zwei Punkte? Der eine mit dem niedrigsten X und der mit dem niedrigsten Y, oder ein Punkt mit dem niedrigsten kombinierten X und Y? –

+0

Wenn sie nicht schon sortiert sind, gibt es nichts schneller als alle zu untersuchen – smirkingman

Antwort

4

Schneller zu schreiben? Vielleicht:

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

Aber das wird ausführen langsamer als eine einzelne foreach Schleife:

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

Ich suche nach der schnellsten Lösung. Warum hast du angenommen, dass der erste langsamer sein wird? – Jamie

+1

auch dieser Code überprüft eine nicht notwendig, wenn jedes Mal, nur xmin und ymin int.MaxValue zuweisen, dann foreach verwenden und der Körper ist nur der else Block –

+1

@HPT - OK, das ist eine ziemlich nette Ergänzung. @Jamie - weil a: es zweimal statt einmal wiederholt, und b: LINQ arbeitet mit dem Ansatz des kleinsten gemeinsamen Nenners - es kann keinen benutzerdefinierten Iterator verwenden, der für den Auflistungstyp definiert ist, und er muss zusätzliche Delegate aufrufen. –

1

Um die niedrigsten x- und y-Positionen getrennt zu erhalten, verwenden

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

Wenn Sie möchten, diejenige mit der niedrigsten kombinierten X- und Y-Position, verwenden Sie

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

Der 'Min' wird kein' Punkt' ... –

+0

Ops. in meiner Antwort jetzt behoben. –

Verwandte Themen