【发布时间】:2009-09-30 01:29:04
【问题描述】:
我有一个 Points 数组,我想在垂直和水平方向上进行排序。
我应该排序两次吗?
【问题讨论】:
我有一个 Points 数组,我想在垂直和水平方向上进行排序。
我应该排序两次吗?
【问题讨论】:
不,你不能只排序两次,因为 .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());
【讨论】:
return x.Y.CompareTo(y.Y); 和 return x.X.CompareTo(y.X);
Point 而不是PointF
使用 LINQ to 对象:
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);
}
}
【讨论】:
【讨论】:
我无法从问题中判断是否通过“垂直和水平排序”您想“先垂直然后水平”对它们进行排序(最好一次完成,正如其他答案所说)或者如果你想对它们进行排序,以便平面中的附近点倾向于在列表中附近。如果是后者,有space filling curves 可以比纯粹的先垂直后水平方法好得多。
【讨论】: