Trier une liste des points 2D (d'abord par X et Y)
-
04-10-2019 - |
Question
Je suis en train de trier une liste de points 2D d'abord par x coordonner et par y coordonner. Je mis en œuvre l'interface IComparer comme suit:
class PointComparer : IComparer<Point>
{
public int Compare(Point x, Point y)
{
if (x.Y != y.Y)
{
return x.Y - y.Y;
}
else
{
return x.X - y.X;
}
}
}
Et puis appeler mon tri comme suit:
pointsList.Sort(new PointComparer());
Pour une raison quelconque la liste ne trie pas. Sûrement quelque chose de très simple et stupide, mais coincé sur ce point pour un certain temps .... TIA
La solution
Cela devrait fonctionner mieux:
class PointComparer : IComparer<Point>
{
public int Compare(Point first, Point second)
{
if (first.X == second.X)
{
return first.Y - second.Y;
}
else
{
return first.X - second.X;
}
}
}
Si les valeurs X sont différentes, il utilisera la valeur Y pour le tri. Ceci est différent de votre code, où les valeurs de X seront utilisées si les valeurs Y sont les mêmes.
Comme d'autres l'ont mentionné, si vous pouvez utiliser LINQ, vous devez utiliser les méthodes d'extension et de OrderBy
ThenBy
:
pointsList.OrderBy(p => p.X).ThenBy(p => p.y)
Autres conseils
Pouvez-vous pas utiliser OrderBy -> ThenBy
Pourquoi ne pas:
var sorted = pointsList.OrderBy(p => p.X)
.ThenBy(p => p.y)