我想首先根据x然后在y上对C#中的类Point列表(见下文)进行排序。
public class Point
{
public int x;
public int y;
public Point(int xp, int yp)
{
x = xp;
y = yp;
}
}
你是如何做到这一点的:我是C#的新手,并且与为类实现自定义比较器的Java比较方法有任何相似之处,而且我想将compare方法(int CompareTo)添加到类中在课堂上排序。
提前致谢。
答案 0 :(得分:8)
是的,您正在寻找IComparable<T>
和IComparer<T>
- 后者相当于Java中的Comparator<E>
接口。
如果要向Point
类本身添加比较,请Point
实现IComparable<Point>
(也可能是非通用的IComparable
接口)。如果要在其他地方实现比较,请创建另一个类实现{.1}}。
对于 equality ,.NET也有IComparer<Point>
和IEquatable<T>
。这些用于IEqualityComparer<T>
中的关键比较。
作为旁注,我强烈建议您不拥有公共字段 - 您可能希望制作变量Dictionary<,>
。 (不可变类型通常更容易推理。)您可以决定readonly
Point
而不是struct
。
答案 1 :(得分:3)
var points = new List<Point>() { new Point(1,3), new Point(1,4), new Point(1,2) };
var sortedPoints = points.OrderBy(point => point.x).ThenBy(point => point.y);
答案 2 :(得分:1)
您可以实现IComparable
接口并实现其
public int CompareTo( object obj )
在这个方法中,您可以编写比较两个对象的逻辑,例如:
if (objectA.x > objectB.x)
return 1
else if (objectA.x < objectB.x)
return -1
else // compare y in both objects
答案 3 :(得分:0)
您希望在C#中实现的接口是IComparable<T>,其行为类似于Java的Comparable。然后你的代码变成
public class Point : IComparable<Point>
{
private int x;
private int y;
public int X
{
get { return x; }
}
public int Y
{
get { return y; }
}
public Point(int xp, int yp)
{
x = xp;
y = yp;
}
public int CompareTo(Point other)
{
// Custom comparison here
}
}
请注意,我将公共字段更改为私有字段,并将面向公众的界面更改为properties。这是更惯用的C# - 公共字段在Java和C#中都不受欢迎。