передача параметра c # в ссылке с полем класса

Я хочу поменять местами поле в классе 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;
    }
}

person BokukPark    schedule 16.04.2015    source источник
comment
Какую ошибку вы получаете?   -  person Rufus L    schedule 16.04.2015
comment
Кажется странным, что класс Point выполняет подкачку. Почему у вас нет метода swap в классе ConvexHull и нет передачи значений индекса int двух позиций, которые вы хотите поменять местами?   -  person hatchet - done with SOverflow    schedule 16.04.2015
comment
Также кажется странным, что пользователи не могут читать или записывать значения x и y Point. Я имею ввиду, что за Point?   -  person Rufus L    schedule 16.04.2015
comment
Ошибка, которую генерирует код, - это ошибка компиляции argument is not classified as a variable.   -  person hatchet - done with SOverflow    schedule 16.04.2015


Ответы (2)


Когда вы индексируете элемент List<T>, вы фактически получаете доступ к индексатору this, который является своего рода свойством (т.е. имеет методы получения и установки). Вы можете передавать только переменные как 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>, чтобы он мог получить доступ к свойству индексатора для выполнения обмена.

person Peter Duniho    schedule 16.04.2015
comment
Вау ... Я очень благодарен. - person BokukPark; 16.04.2015

Выбросьте почти все это. Вы не можете передавать свойства или перечислять объекты по ссылке. Я замечаю, что изначально эти точки ничего не заполняют. Заполните свой список точек, затем вызовите функцию в своем классе ConvexHull для SwapPoints (int point1idx, int point2idx) и напишите там код для обмена.

В классе Point выставьте X и Y и отбросьте оттуда процедуру обмена, так как она никогда не будет работать.

person Curt Tabor    schedule 16.04.2015