【问题标题】:Sort a 2D Points List (first by X and then Y)对 2D 点列表进行排序(首先按 X,然后按 Y)
【发布时间】:2011-02-17 04:23:18
【问题描述】:

我正在尝试先按 x 坐标然后按 y 坐标对 2D 点列表进行排序。 我实现了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;
        }

    }
}

然后调用我的排序如下:

pointsList.Sort(new PointComparer());

由于某种原因,列表没有排序。当然是非常简单和愚蠢的事情,但坚持了很长一段时间....TIA

【问题讨论】:

  • 你为什么要把IntPointPoint比较?
  • 抱歉打错了。已更正。
  • 不是先按 Y 再按 X 排序吗?此外,xy 在这种情况下是可怕的名字。
  • “不排序”是指列表的顺序与您开始时的顺序相同,还是只是无法正常工作?
  • 表示根本不排序,保留原始订单。

标签: c# sorting icomparable points


【解决方案1】:

你不能使用 OrderBy -> ThenBy 吗?

http://msdn.microsoft.com/en-us/library/bb534743.aspx

【讨论】:

  • 虽然这应该可行,但这不是 OP 所要求的。他想知道他的方法做错了什么(即为什么使用比较器不起作用)
【解决方案2】:

这应该会更好:

class PointComparer : IComparer<Point>
{
  public int Compare(Point first, Point second)
  {
    if (first.X == second.X)
    {
        return first.Y - second.Y;
    }
    else
    {
        return first.X - second.X;
    }

  }
}

如果 X 值不同,它将使用 Y 值进行排序。这与您的代码不同,如果 Y 值相同,将使用 X 值。

正如其他人所说,如果你可以使用 Linq,你应该使用 OrderByThenBy 扩展方法:

pointsList.OrderBy(p => p.X).ThenBy(p => p.y)

【讨论】:

  • 谢谢。但运气不好,原来的顺序保持不变。
  • 这几乎和他一样,除了你的错字“first.X == first.X”......这总是正确的,所以 else 永远不会命中
【解决方案3】:

为什么不:

var sorted = pointsList.OrderBy(p => p.X)
                       .ThenBy(p => p.y)

【讨论】:

  • 虽然这应该可行,但这不是 OP 所要求的。他想知道他的方法做错了什么(即为什么使用比较器不起作用)
猜你喜欢
  • 2021-08-04
  • 2014-09-22
  • 1970-01-01
  • 2018-05-30
  • 1970-01-01
  • 2011-08-22
  • 2023-03-05
  • 2023-03-25
  • 1970-01-01
相关资源
最近更新 更多