【问题标题】:Sort Points vertically then horizontally垂直排序点然后水平排序
【发布时间】:2009-09-30 01:29:04
【问题描述】:

我有一个 Points 数组,我想在垂直和水平方向上进行排序。

我应该排序两次吗?

【问题讨论】:

    标签: c# sorting


    【解决方案1】:

    不,你不能只排序两次,因为 .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 作为记录,这大约是我的 LINQ 解决方案的两倍。
    • Y&X 的类型是 double ... 在返回语句中分别使用 return x.Y.CompareTo(y.Y);return x.X.CompareTo(y.X);
    • 那些是Point 而不是PointF
    • 感谢您提供非 linq 答案!
    【解决方案2】:

    使用 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);
        }
    }
    

    【讨论】:

      【解决方案3】:

      【讨论】:

        【解决方案4】:

        我无法从问题中判断是否通过“垂直和水平排序”您想“先垂直然后水平”对它们进行排序(最好一次完成,正如其他答案所说)或者如果你想对它们进行排序,以便平面中的附近点倾向于在列表中附近。如果是后者,有space filling curves 可以比纯粹的先垂直后水平方法好得多。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-11-10
          • 1970-01-01
          • 2013-10-18
          • 2019-03-24
          • 2013-03-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多