Ordina un 2D Punti List (prima con X e poi Y)
-
04-10-2019 - |
Domanda
Sto cercando di ordinare un elenco di punti 2D prima con coordinata x e poi con coordinata y. Ho implementato l'interfaccia IComparer come segue:
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;
}
}
}
E poi chiamare il mio ordinamento come segue:
pointsList.Sort(new PointComparer());
Per qualche ragione la lista non fa specie. Sicuramente è qualcosa di molto semplice e stupido, ma bloccato su questo per un bel po '.... TIA
Soluzione
Questo dovrebbe funzionare meglio:
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;
}
}
}
Se i valori X sono differenti, si utilizza il valore Y per l'ordinamento. Questo è diverso dal codice, in cui verranno utilizzati i valori X, se i valori Y sono gli stessi.
Come altri hanno detto, se è possibile utilizzare LINQ, è necessario utilizzare i metodi OrderBy
e di estensione ThenBy
:
pointsList.OrderBy(p => p.X).ThenBy(p => p.y)
Altri suggerimenti
Non potresti usare OrderBy -?> ThenBy
Perché non:
var sorted = pointsList.OrderBy(p => p.X)
.ThenBy(p => p.y)