使用LINQ在C#中排序列表

时间:2016-05-26 09:42:59

标签: c# linq list sorting

这些类定义了多边形List<Polygon> Polygons列表。

如何订购该列表,以便多边形首先按其点的 X 属性排序,然后按其点的 Y 属性排序顺序。

public class Polygon
{
    public List<Point2D> Points;
}

public class Point2D
{
    public double X;
    public double Y;
}

更新:例如,请考虑以下多边形:

(A) (0, 0) -> (5, 1) -> (5, -3) -> (0, -3) -> (0, 0)
(B) (0, -10) -> (5, -9) -> (5, -13) -> (0, -13) -> (0, -10)
(C) (10, 0) -> (15, 1) -> (15, -3) -> (10, -3) -> (10, 0)

排序后的输出:

(A) (0, -10) -> (5, -9) -> (5, -13) -> (0, -13) -> (0, -10)
(B) (0, 0) -> (5, 1) -> (5, -3) -> (0, -3) -> (0, 0)
(C) (10, 0) -> (15, 1) -> (15, -3) -> (10, -3) -> (10, 0)

3 个答案:

答案 0 :(得分:2)

您需要将其他属性添加到多边形类

public class Polygon
{
    public List<Point2D> Points;

    public Point2D MinPoint;
}

这部分将取决于你的分数,并擅长适合你的算法。 那么你需要找到多边形的最小点一个多边形的代表。可能是凸壳的中心,左下点或中心。一位代表。 (这可能有点不对,但你需要稍微玩一下)。这取决于各种情况

foreach(var poly in Polygons)
{
    int minx = poly.Points.Min(p=>p.X);
    int minY = poly.Points.Where(p=>p.X==minX).Min(p=>p.Y);
    poly.MinPoint = poly.Points.FirstOrDefault(p=>p.X==minX && p.Y==minY)
}

然后你可以对它进行排序。

var sortedPolygons = polygons.OrderBy(p=>p.MinPoint.X).ThenBy(p=>p.MinPoint.Y);

答案 1 :(得分:1)

您似乎想要根据点的最小X值对多边形进行排序,如果它们相等,则基于其点的最小Y值。

以下是使用LINQ的方法:

var result =
    Polygons
    //Order by smallest X
    .OrderBy(pl => pl.Points.Min(pn => pn.X)) 
    //Then by smallest Y
    .ThenBy(pl => pl.Points.Min(pn => pn.Y))
    .ToList();

答案 2 :(得分:0)

您可以编写一个Comparer类来比较多边形内的点,并使用它来对多边形进行排序。

class PointsComparer : IComparer<List<Point2D>>
{
    public int Compare(List<Point2D> left, List<Point2D> right)
    {
        for (int i = 0; i < left.Count && i < right.Count; i++) {
            int c = left[i].X.CompareTo(right[i].X);
            if (c != 0) return c;
            c = left[i].Y.CompareTo(right[i].Y);
            if (c != 0) return c;
        }
        return left.Count.CompareTo(right.Count);
    }
}


polygons.OrderBy(poly => poly.Points, new PointsComparer());

附注:您可能希望将这些字段转换为属性。