Как присвоить полю объекта значение по ссылке?

Есть массив проинициализированных picturebox-ов. Я хочу найти расстояние между всевозможными парами picturebox-ов из этого массива. Потом отсортировать полученные значения с сохранением информации о том, для какой именно пары picturebox-ов каждое расстояние рассчитывалось. И далее менять расположение этих picturebox-ов. Планирую реализовать это так: Создать класс, экземпляр которого хранил бы в себе в полях пару picturebox-ов из первого массива по ссылке, поле "расстояние между двумя picturebox-ами", а также метод вычисляющий это расстояние. Создать массив или список из таких экземпляров. Отсортировать его. И далее модифицировать свойство location полей этих объектов (т.е. что бы после этого менялось это свойство исходных picturebox-ов). Какие сложности вижу этого подхода:

  1. Я не знаю как передать в поле значение по ссылке.
  2. При создании массива, нужно заранее знать какое количество будет элементов, в моём случае количество picturebox-ов может быть разным, т.е. придётся каждый раз высчитывать число пар picturebox-в.

Подскажите, возможно есть более изящное решение? Или как мне реализовать мой подход, с учётом обозначенных трудностей).


Ответы (1 шт):

Автор решения: Andrei Khotko
  1. Поля всегда хранят ссылку на область памяти, где лежит "значение" объекта
  2. Если число элементов заранее неизвестно - используйте список List<PictureBox>.

Что же касается задачи:

Планирую реализовать это так: Создать класс, экземпляр которого хранил бы в себе в полях пару picturebox-ов из первого массива по ссылке, поле "расстояние между двумя picturebox-ами", а также метод вычисляющий это расстояние.

Вы слишком серьезно подошли к этой проблеме. Нужно быть проще. Вам нужен метод, который посчитает расстояние между двумя объектами PictureBox.

  • На входе метода: два объекта PictureBox
  • Нужно вернуть: расстояние между двумя объектами PictureBox.

Таким образом, все что вам нужно - это один статический метод:

public static double GetDistanceBetween(PictureBox pictureBox1, PictureBox pictureBox2)
{
    double distance = /* Здесь ваша логика вычисления расстояния между pictureBox1 и pictureBox2 */
    return distance;
}

UPD: Не сразу внимательно прочитал вопрос.

Чтобы хранить информацию о том, для каких пар было вычислено расстояние, можно создать следующий класс:

public class PictureBoxDistance
{
    public double Distance { get; }
    public PictureBox PictureBox1 { get; }
    public PictureBox PictureBox2 { get; }
    
    public PictureBoxDistance(PictureBox pictureBox1, PictureBox PictureBox2)
    {
        Distance = /* Здесь ваша логика вычисления расстояния между pictureBox1 и pictureBox2 */
    }
}

И использовать:

var pictures = new List<PictureBox>() {pictureBox1, pictureBox2, pictureBox3 /*...*/};
var distances = new List<PictureBoxDistance>();

// Где-то в цикле по i, j, где вы перебираете всевозможные пары
var pictureBoxDistance = new PictureBoxDistance(pictures[i], pictures[j]);
distances.Add(pictureBoxDistance);

// Далее после цикла
var sortedDistances = distances.OrderBy(p => p.Distance).ToList();

// Перебор отсортированных растояний
foreach(var distance in sortedDistances)
{
    // И тут можно получить доступ к парам PictureBox:
    //     distance.PictureBox1
    //     distance.PictureBox2
    // и к расстоянию
    //     distance.Distance
}
→ Ссылка