我有一个Points
数组,我想垂直和水平排序。
我应该排序两次吗?
答案 0 :(得分:13)
不,你不能只进行两次排序,因为.Net框架Sort()算法是一种不稳定的排序,这意味着当你对项目进行排序时,他们原来所处的顺序不会被考虑在内,也就是说当两个项目相等,它们相对于彼此的位置将是不确定的。
您需要做的是为您要排序的类实现自定义IComparer,并在对集合进行排序时使用该比较器:
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;
}
}
}
用法:
List<Point> list = ...;
list.Sort(new PointComparer());
答案 1 :(得分:4)
使用LINQ对象:
using System;
using System.Linq;
using System.Drawing;
class Example
{
static void Main()
{
Point[] points = new Point[]
{
new Point(2,2),
new Point(3,1),
new Point(3,2),
new Point(1,3)
};
var sortedPoints = points
.OrderBy(p => p.X)
.ThenBy(p => p.Y);
}
}
答案 2 :(得分:0)
答案 3 :(得分:0)
我无法从问题中看出是否“纵向和横向排序”你想要“先垂直然后水平”排序(最好在一次通过中完成,正如其他答案所说)或者如果你想要对它们进行排序,使得平面中的附近点往往位于列表附近。如果是后者,那么space filling curves可能比纯粹的第一垂直然后水平方法好得多。