2010-11-22 47 views
1

supposons que j'ai une collection de points (PointCollection). Ce que je veux faire est de trouver la valeur minimale des coordonnées X et Y parmi ces points. Évidemment, on pourrait parcourir la collection et vérifier les coordonnées pas à pas.Les valeurs minimales des coordonnées X et Y dans PointCollection (C#)

Je me demande s'il existe une solution plus rapide et plus efficace.

Avez-vous des idées?

Merci

+1

Vous voulez donc deux points? Celui avec le plus bas X et celui avec le plus bas Y, ou un point avec le plus bas combiné X et Y? –

+0

Sauf s'ils sont déjà triés, il n'y a rien de plus rapide que de les examiner tous – smirkingman

Répondre

4

Plus rapide à taper? Peut-être:

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

Mais cela exécuter plus lent qu'une seule boucle foreach:

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

Je cherche la solution la plus rapide. Pourquoi avez-vous supposé que le premier sera plus lent? – Jamie

+1

aussi ce code vérifie un aucun nécessaire si à chaque fois, il suffit d'assigner xmin et ymin à int.MaxValue, puis utiliser foreach et le corps est juste l'autre bloc –

+1

@HPT - OK, que ce soit une belle addition. @Jamie - parce que a: il boucle deux fois plutôt qu'une fois, et b: LINQ fonctionne sur l'approche du dénominateur le moins commun - il ne peut utiliser aucun itérateur personnalisé défini pour le type de collection, et doit faire des appels délégués supplémentaires. –

1

Pour obtenir les plus bas positions x et y séparement, utilisez

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

Si vous voulez celui avec la position combinée X et Y la plus basse, utilisez

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

Le 'Min' ne sera pas un' Point' ... –

+0

Ops. fixé dans ma réponse maintenant. –