2015-12-28 2 views
-2

У меня есть программа C#, которая извлекает квадраты из сетки sudoku. Экстракция сделана правильно, как показано здесь: http://puu.sh/mbHl9/eefe8d7b07.jpgСтранное поведение C# OrderBy

Я получил массив прямоугольников из GetObjectsRectangles aforge по методе(), который вы видите, нарисованные на картинке выше.

Я сортировка этого массива с помощью следующей строки коды:

var rektsList = rekts.OrderBy(x => x.Top).ThenBy(x => x.Left).ToList(); 

и сортируют правильно, для одной причуды, которая является то, что первый элемент размещен пятым в списке, как это, за исключением:

X: 435 Y: 998 
X: 540 Y: 998 
X: 335 Y: 1001 
X: 643 Y: 1001 
X: 744 Y: 1005 
X: 245 Y: 1008 
X: 845 Y: 1011 
X: 941 Y: 1017 
X: 1037 Y: 1022 
X: 433 Y: 1097 
X: 539 Y: 1097 
X: 332 Y: 1099 
X: 643 Y: 1099 
X: 746 Y: 1103 
X: 241 Y: 1106 
X: 847 Y: 1108 
X: 944 Y: 1113 
X: 1041 Y: 1118 
X: 431 Y: 1197 
X: 539 Y: 1197 
X: 643 Y: 1199 
X: 329 Y: 1200 
X: 747 Y: 1202 
X: 237 Y: 1206 
X: 850 Y: 1206 
X: 948 Y: 1211 
X: 1046 Y: 1215 
X: 538 Y: 1301 
X: 429 Y: 1302 
X: 644 Y: 1302 
X: 326 Y: 1304 
X: 748 Y: 1305 
X: 233 Y: 1309 
X: 852 Y: 1309 
X: 951 Y: 1312 
X: 1050 Y: 1315 
X: 427 Y: 1405 
X: 537 Y: 1405 
X: 644 Y: 1406 
X: 323 Y: 1407 
X: 750 Y: 1408 
X: 854 Y: 1410 
X: 229 Y: 1411 
X: 955 Y: 1413 
X: 1054 Y: 1415 
X: 425 Y: 1512 
X: 536 Y: 1512 
X: 644 Y: 1513 
X: 319 Y: 1514 
X: 751 Y: 1514 
X: 857 Y: 1515 
X: 958 Y: 1517 
X: 224 Y: 1518 
X: 1059 Y: 1518 
X: 423 Y: 1623 
X: 535 Y: 1623 
X: 644 Y: 1623 
X: 753 Y: 1623 
X: 859 Y: 1624 
X: 961 Y: 1624 
X: 316 Y: 1625 
X: 1063 Y: 1625 
X: 220 Y: 1628 
X: 1068 Y: 1731 
X: 645 Y: 1732 
X: 754 Y: 1732 
X: 862 Y: 1732 
X: 965 Y: 1732 
X: 534 Y: 1733 
X: 421 Y: 1734 
X: 313 Y: 1736 
X: 216 Y: 1738 
X: 1073 Y: 1841 
X: 970 Y: 1842 
X: 865 Y: 1843 
X: 755 Y: 1844 
X: 645 Y: 1846 
X: 533 Y: 1847 
X: 418 Y: 1848 
X: 309 Y: 1850 
X: 211 Y: 1851 

У кого-нибудь есть идея, почему такое поведение происходит? Я что-то пропустил?

+3

... но сортировка кажется правильной, сначала вы сортируете по Y, затем по X, поэтому порядок правильный. Я думаю, вы должны перефразировать свой вопрос, чтобы сделать вашу проблему более ясной. – ViRuSTriNiTy

+1

К пятому элементу вы имеете в виду 'X: 744 Y: 1005'? Или вы имеете в виду, что 'X: 435 Y: 998' становится пятым элементом упорядоченного списка? Я не совсем уверен, что список, который вы опубликовали, является исходным списком или отсортированным списком. –

+4

Что это значит? Похоже, что он упорядочивает «сверху», затем «левым», то есть «Y», затем «X». Если бы вы подумали об обратном, я бы предположил, что вы сначала будете жаловаться на третий элемент. – Dronz

ответ

3

Предполагая, что Top означает Y и Left означает X, тогда выход соответствует коду.

OrderBy делается первым, чтобы отсортировать по столбцу Y. После этого ThenBy выполняется для разрешения связей в столбце Y - это сортирует строки, которые имеют одинаковое значение Y по значению X.

ThenBy является обеспечение этих привязанных элементов в порядке:

X: 423 Y: 1623 
X: 535 Y: 1623 
X: 644 Y: 1623 
X: 753 Y: 1623 

Если вы хотите заказать по строкам и столбцам, а не по X и Y, то вам необходимо перевести координаты в ряды и колонны.

Один из способов сделать это, чтобы преобразовать координаты баллов:

var rektsList = rekts.OrderBy(x => (10*x.Top) + x.Left).ToList() 

Это зависит от максимальной ошибки в 10 * Y быть меньше минимальной разницы в X.

+0

Ой, значит, проблема в том, что значения у не уникальны? – raketwissenschaftler

+0

Каждая серия, где Y - то же самое, что серия упорядочивается X, как в первых двух элементах – Plutonix

+0

Проблема в том, что Y не является идентификатором строки, он слишком уникален. –

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