c#OrderBy的奇怪行为

时间:2015-12-28 21:15:23

标签: c# linq

我有一个c#程序从sudoku网格中提取方块。提取正确完成,如下所示: http://puu.sh/mbHl9/eefe8d7b07.jpg

我从aforge的GetObjectsRectangles()方法获得了一个矩形数组,您可以在上图中看到它。

我使用以下代码行对此数组进行排序:

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

有没有人知道为什么会发生这种行为?我错过了什么吗?

1 个答案:

答案 0 :(得分:3)

假设Top表示Y,Left表示X,则输出与代码匹配。

首先完成OrderBy以按Y列排序。之后,ThenBy完成解析Y列中的关系 - 这会将具有相同Y值的行排序为X值。

然后确保这些绑定的元素按顺序排列:

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中的最小差异。