Как присвоить полю объекта значение по ссылке?
Есть массив проинициализированных picturebox-ов. Я хочу найти расстояние между всевозможными парами picturebox-ов из этого массива. Потом отсортировать полученные значения с сохранением информации о том, для какой именно пары picturebox-ов каждое расстояние рассчитывалось. И далее менять расположение этих picturebox-ов. Планирую реализовать это так: Создать класс, экземпляр которого хранил бы в себе в полях пару picturebox-ов из первого массива по ссылке, поле "расстояние между двумя picturebox-ами", а также метод вычисляющий это расстояние. Создать массив или список из таких экземпляров. Отсортировать его. И далее модифицировать свойство location полей этих объектов (т.е. что бы после этого менялось это свойство исходных picturebox-ов). Какие сложности вижу этого подхода:
- Я не знаю как передать в поле значение по ссылке.
- При создании массива, нужно заранее знать какое количество будет элементов, в моём случае количество picturebox-ов может быть разным, т.е. придётся каждый раз высчитывать число пар picturebox-в.
Подскажите, возможно есть более изящное решение? Или как мне реализовать мой подход, с учётом обозначенных трудностей).
Ответы (1 шт):
- Поля всегда хранят ссылку на область памяти, где лежит "значение" объекта
- Если число элементов заранее неизвестно - используйте список
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
}