Мне нужно рассчитать расстояния между каждой парой точек в массиве и только делать это один раз за пару. Является ли то, что я придумал достаточно эффективно, или есть лучший способ? Вот пример, а также визуальное объяснение того, что я пытаюсь получить:
например, сначала получить сегменты A-B, A-C, A-D; затем B-C, B-D; и, наконец, C-D. Другими словами, нам нужен A-B в нашем новом массиве, но не B-A, поскольку это будет дублирование.
var pointsArray = new Point[4];
pointsArray[0] = new Point(0, 0);
pointsArray[1] = new Point(10, 0);
pointsArray[2] = new Point(10, 10);
pointsArray[3] = new Point(0, 10);
// using (n * (n-1)) / 2 to determine array size
int distArraySize = (pointsArray.Length*(pointsArray.Length - 1))/2;
var distanceArray = new double[distArraySize];
int distanceArrayIndex = 0;
// Loop through points and get distances, never using same point pair twice
for (int currentPointIndex = 0; currentPointIndex < pointsArray.Length - 1; currentPointIndex++)
{
for (int otherPointIndex = currentPointIndex + 1;
otherPointIndex < pointsArray.Length;
otherPointIndex++)
{
double xDistance = pointsArray[otherPointIndex].X - pointsArray[currentPointIndex].X;
double yDistance = pointsArray[otherPointIndex].Y - pointsArray[currentPointIndex].Y;
double distance = Math.Sqrt(Math.Pow(xDistance, 2) + Math.Pow(yDistance, 2));
// Add distance to distanceArray
distanceArray[distanceArrayIndex] = distance;
distanceArrayIndex++;
}
}
Так как это будет использоваться со многими тысячами точек, я думаю, что размерный массив будет более эффективным, чем использование любого типа IEnumerable.