我在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()
!
答案 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)
假设您的horizontalSegments
为List<Segment>
,List<T>.Sort
方法要求T实现IComparable<T>
接口,您忘记将其添加到Segment
类的声明中。这是InvalidOperationException的原因。 Segment
类已经有CompareTo
接口所需的IComarable<T>
方法。所以只需添加它。
class Segment : IComparable<Segment>