Оптимизация выборки из списка

329
12 мая 2017, 14:05

Всем доброе время суток! У меня есть список LIST, где хранятся значения координат. Также у меня есть участок, например 2000м на 2000м, который разбили на более мелкие участки (25 на 25 метров). Из этого исходя у меня есть сетка 80 на 80, куда мне ну;yj разместить точки из списка и подсчитать, сколько этих точек находится на каждом из этих маленьких участков (который 25 на 25 метров)

Я сделал следующий алгоритм, но на таких объемах, какие я указал в примере, программа тратит кучу времени и ресурсов для выполнения этих действий. Точек в списке примерно 400-600:

            for (int i = 0, i1 = 0; i < 2000 && i1 < 80; i = i + 25, i1 += 1)
            {
                for (int j = 0, j1 = 0; j < 2000 && j1 < 80; j = j + 25, j1 += 1)
                {
                   //CountSelectedPointsInBin список координат
                   // выполняю linq запрос по расчету суммы точек на нужном маленьком участке
                    int multip = CountSelectedPointsInBin.Where(p => p.PointX >= i && p.PointX <= i + SizeBinX && p.PointY >= j && p.PointY <= j + SizeBinY).Sum(p => p.NumRect);
                    // загоняю все в массив
                    arrayBin[i1, j1] = multip;
                }

Как можно оптимизировать этот код?? Или вообще сделать по другому, чтобы программа быстрее выполняла такие не сложные операции?

   public static List<PointsSelectedObjects> CountSelectedPointsInBin
    {
        get
        {
            if (selectedPointsInBin.Count != 0) return countSelectedPointsInBin;
            else return null;
        }
    }
    public static void CountintsInBin()
    {
        countSelectedPointsInBin = new List<PointsSelectedObjects>();
        for (int i = 0; i < selectedPointsInBin.Count; i++)
        {
            double coordX = 0, coordY = 0;
            for (int j = 0; j < selectedPointsInBin.Count; j++)
            {
                if (selectedPointsInBin[i].PointX == selectedPointsInBin[j].PointX && selectedPointsInBin[i].PointY == selectedPointsInBin[j].PointY)
                {
                    countPoints++;
                    coordX = selectedPointsInBin[i].PointX;
                    coordY = selectedPointsInBin[i].PointY;
                }
            }
            PointsSelectedObjects points = new PointsSelectedObjects(coordX, coordY, countPoints);
            countSelectedPointsInBin.Add(points);
            countPoints = 0;
        }
    }

Его я вызываю на форме и он подсчитывается нормально.

Вот класс этих координат:

public class PointsSelectedObjects
{
    double pointX;
    double pointY;
    int numRect;
    int countPoints;
    public PointsSelectedObjects(double x, double y, int countPoints, bool point = false)
    {
        pointX = x;
        pointY = y;
        this.countPoints = countPoints;
    }

И там еще есть public свойства этих перемен (get и set)

Answer 1

list - ваш массив с точками. arr - массив полей. Значение — количество попаданий

var arr = new int[80, 80];
list.ForEach(t => arr[(int)(t.X / 25), (int)(t.Y / 25)]++);

Время выполнения: O(n).

READ ALSO
Какие задачи решает структура ArraySegment&lt;T&gt;?

Какие задачи решает структура ArraySegment<T>?

Какие задачи решает структура ArraySegment?

339
Копирование файлов по локальной сети с аутентификацией

Копирование файлов по локальной сети с аутентификацией

Есть консольное приложение, в котором нужно копировать файлы по локальной сети как с аутентификацией так и безЗнаю, что без аутентификации...

326
В чем разница между int.Parse() и Convert.ToInt32()

В чем разница между int.Parse() и Convert.ToInt32()

В чем разница между intParse() и Convert

322