排序和合并间隔c#

时间:2016-03-12 00:19:35

标签: c# sorting

我在2D空间中有一个段间隔列表。我的Segment类定义如下:

class Segment
{
    public int startPoint { get; set; }
    public int endPoint { get; set; }
    public int commonPoint { get; set; }
}

每个段都有一个起点,一个端点和公共点,所以我知道哪些段是共线的。在我的主程序中,我读了用户以这种格式输入的一些行:{startpoint.X,startPoint.Y,endPoint.X,endPoint.Y}
所以用户输入这样的数据:

4 //this is the number of lines  
0 1 2 1  
1 4 1 2  
0 3 2 3  
2 1 6 1  

这是读取数据的代码:

static void Main(string[] args)
{
    int n = 0; //number of input segments
    n = Convert.ToInt32(Console.ReadLine());

    string[] values; //hold input segments' startpoints and endpoints
    int x1, y1, x2, y2;
    for (int i = 0; i < n; i++)
    {
        values = Console.ReadLine().Split(' ');
        x1 = Convert.ToInt32(values[0]); y1 = Convert.ToInt32(values[1]);
        x2 = Convert.ToInt32(values[2]); y2 = Convert.ToInt32(values[3]);

        if (x1 == x2) //this is a vertical line
        {
            if(y1 > y2) //storing the segment intervals form left to right
                verticalSegments.Add(new Segment { startPoint = y2, endPoint = y1, commonPoint = x1 });
            else
                verticalSegments.Add(new Segment { startPoint = y1, endPoint = y2, commonPoint = x1 });
        }
        else // this is a horizontal line
        {
            if (x1 > x2) //storing the segment intervals form left to right
                horizontalSegments.Add(new Segment { startPoint = x2, endPoint = x1, commonPoint = y1 });
            else
                horizontalSegments.Add(new Segment { startPoint = x1, endPoint = x2, commonPoint = y1 });
        }
    }

现在我想在垂直或水平的segements上调用sort()方法,通过startingPoints(最好是升序)对列表中的段进行排序。

我尝试像这样编辑我的Segment类:

class Segment
{
    public int startPoint { get; set; }
    public int endPoint { get; set; }
    public int commonPoint { get; set; }
    public override bool Equals(object obj)
    {
        if (obj == null) return false;
        Segment objAsSegment = obj as Segment;
        if (objAsSegment == null) return false;
        else return Equals(objAsSegment);
    }
    public int sortByStartingPointAscending(int startPoint1, int startPoint2)
    {
        return startPoint1.CompareTo(startPoint2);
    }
    public int CompareTo(Segment compareSegment)
    {
        if (compareSegment == null) return 1;
        else
            return this.startPoint.CompareTo(compareSegment.startPoint);
    }
    public override int GetHashCode()
    {
        return startPoint;
    }
    public bool Equals(Segment other)
    {
        if (other == null) return false;
        return (this.startPoint.Equals(other.startPoint));
    }
}

我在主方法中调用了horizontalSegments.Sort();。但是我收到了一个错误:

致电InvalidOperationException was unhandled行的

sort()

2 个答案:

答案 0 :(得分:1)

创建并实现一个方法,对两个Segment对象进行必要的比较,并将其传递给列表的Sort方法。

比较方法的签名需要如下(它们可以是静态的):

public static int CompareSegmentHorizontal(Segment x, Segment y) {
// your code here; return 0 if equal, -1 when x is less than y, and 1 if x is greater then y
}

并像这样使用它:

horizontalSegments.Sort(CompareSegmentHorizontal);

次要注意:与Java不同,在C#中以PascalCase表示法编写方法和属性名称很常见。

答案 1 :(得分:1)

假设您的horizontalSegmentsList<Segment>List<T>.Sort方法要求T实现IComparable<T>接口,您忘记将其添加到Segment类的声明中。这是InvalidOperationException的原因。 Segment类已经有CompareTo接口所需的IComarable<T>方法。所以只需添加它。

class Segment : IComparable<Segment>