2014-01-16 7 views
5

У меня есть список точек с 50 элементами, я хотел сортировать их, поэтому я использовал orderby thenby to, но мой вывод кажется неправильным. Первые элементы сортируются соответственно, но следующие неправильно, вот скриншот.OrderBy(). ThenBy() неправильный вывод

enter image description here

1-ые пять данных, где упорядоченные правильно, что должно быть, что бы другие данные. но следующие - нет. Я не знаю, в чем проблема.

Так что следующий пять выход должен быть:

{X=249, Y=198} 

{X=249, Y=308} 

{X=249, Y=413} 

{X=249, Y=519} 

{X=249, Y=629} 

Мой список список PointF:

List<PointF> points = new List<PointF>(); 

Вот мой код:

points = points.OrderBy(c => c.X).ThenBy(c => c.Y).ToList(); 
+2

Мое подозрение в том, что ваши значения X не являются точными. Например, вы можете иметь X = 249 и X = 249.00000001 в разных точках. Попробуйте изменить код на 'OrderBy (c => Math.Floor (c.X)). ThenBy (c => c.Y)' – Zruty

+0

@Zruty: Очень правдоподобно; вы должны написать это как ответ! – Ani

+0

@ Zruty вы ответ дали мне правильный результат, я не понимаю, почему. Спасибо zruty! +1 – julianconcepcion

ответ

6

Пожалуйста, убедитесь, что ваши очки Значения X действительно равны. Я предполагаю, что и 249, и 249.000001 могут отображаться как «249» в списке, но не будут равны для целей заказа.

Я предлагаю изменить свой код

points = points.OrderBy(c => Math.Round(c.X)).ThenBy(c => c.Y).ToList(); 

и увидеть, если проблема исчезла.

UPDATE: если ваши координаты, как ожидается, будут нецелыми, переключиться на сравнение с заданной точностью:

var precision = 0.001; // choose the value that suits you. If the tow values are different by less than this amount, the values are considered equal. 
points = points.OrderBy(c => Math.Round(c.X/precision)).ThenBy(c => c.Y).ToList(); 

Кроме того, вместо того, чтобы использовать Round(c.X) можно использовать (int)c.X, так как ваши комментарии показывают, что как вы выводите свои значения в список.

+0

Я пробовал этот метод, но я даю неправильный результат. потому что, если, например, есть x = 249, y = 360 и x = 249,6, y = 180. Вторая координата x будет округлена до 250. Поэтому при сортировке будет {X = 250, Y = 160}, то {X = 249, Y = 360} – julianconcepcion

+0

Пожалуйста, см. Обновленный ответ – Zruty

+0

эй @ Zruty, ваше решение дало мне правильный ответ. Спасибо большое. Но я не понимаю, как это работает, я знаю, что точность работает как порог или что-то еще? – julianconcepcion

Смежные вопросы