垂直然后水平排序点

时间:2009-09-29 16:52:44

标签: c# sorting

我有一个Points数组,我想垂直和水平排序。

我应该排序两次吗?

4 个答案:

答案 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可能比纯粹的第一垂直然后水平方法好得多。