2010-05-08 2 views
2

Я пытаюсь сортировать список двумерных точек сначала по координате x, а затем по координате y. я реализовал интерфейс IComparer следующим образом:Сортировка 2D-списка точек (сначала по X, а затем по Y)

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; 
     } 

    } 
} 

И затем вызвать мою сортировку следующим образом:

pointsList.Sort(new PointComparer()); 

По какой-то причине список не сортировать. Наверняка это что-то очень простое и глупое, но надолго застряло на этом. TIA

+0

Почему вы сравнивающие 'IntPoint' с' Point'? – kennytm

+0

Извините, что это была ошибка. исправленный. – Mikos

+4

Разве это не сортировка по Y, а затем по X? Кроме того, 'x' и' y' являются ужасными именами в этом контексте. – Kobi

ответ

6

Это должно работать лучше:

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; 
    } 

    } 
} 

Если значения X различны, он будет использовать значение Y для сортировки. Это отличается от вашего кода, где значения X будут использоваться, если значения Y одинаковы.

Как уже упоминалось выше, если вы можете использовать Linq, вы должны использовать OrderBy и ThenBy методы расширения:

pointsList.OrderBy(p => p.X).ThenBy(p => p.y) 
+0

Thx. но не повезло, первоначальный порядок остается неизменным. – Mikos

+3

это почти то же самое, что и у него, за исключением того, что у вас есть опечатка «first.X == first.X» ... это всегда правда, поэтому else никогда не ударил бы –

+0

thx @miky, вот и все! уф! – Mikos

1

Не могли бы вы использовать OrderBy -> ThenBy?

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

+0

Хотя это должно сработать, это не то, что задал ОП. Он хочет знать, что он делает не так с его подходом (т. Е. Почему использование Comparer не работает) –

0

Почему нет:

var sorted = pointsList.OrderBy(p => p.X) 
         .ThenBy(p => p.y) 
+0

Хотя это должно сработать, это не то, что задал ОП. Он хочет знать, что он делает не так с его подходом (т. Е. Почему использование Comparer не работает) –