我想交换ConvexHull类中的字段,就像swap(points [0],points [1])。
我该怎么做?
public class ConvexHull
{
List<Point> points;
public void run ()
{
Point.swap ( ref points[ 0 ], ref points[ 1 ] ); //Error!!
}
}
public class Point
{
private double x, y;
Point () { x = y = 0; }
public static void swap(ref Point a, ref Point b) {
Point c = a;
a = b;
b = c;
}
}
答案 0 :(得分:1)
当您索引List<T>
的元素时,您实际上正在访问this
索引器,这是一种属性(即具有getter和setter方法)。您只能将变量作为ref
或out
传递,而不是属性。
在你的场景中,也许你想要更像这样的东西:
public class ConvexHull
{
List<Point> points;
public void run ()
{
swap(0, 1); //No error!!
}
private void swap(int i, int j)
{
Point point = points[i];
points[i] = points[j];
points[j] = point;
}
}
更通用的解决方案可能如下所示:
public class ConvexHull
{
List<Point> points;
public void run ()
{
points.SwapElements(0, 1);
}
}
static class Extensions
{
public static void SwapElements<T>(this List<T> list, int index1, int index2)
{
T t = list[index1];
list[index1] = list[index2];
list[index2] = t;
}
}
在任何一种情况下,正确的方法是提供实际交换值的代码,以及对List<T>
对象本身的访问权限,以便它可以访问索引器属性来完成交换。
答案 1 :(得分:0)
扔掉了所有这些。您不能通过ref传递属性或列表对象。我注意到最初没有任何东西填充这些点。填充您的Points列表,然后将您的ConvexHull类中的函数调用到SwapPoints(int point1idx,int point2idx)并在那里编写代码以进行交换。
在Point类上,公开X和Y,并从那里删除交换例程,因为它永远不会工作。