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

È stato utile?

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

http://msdn.microsoft.com/en-us/library /bb534743.aspx

Perché non:

var sorted = pointsList.OrderBy(p => p.X)
                       .ThenBy(p => p.y)
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top