Есть ли способ быстрее просмотреть определенный индекс без использования массива?C#

Место общения программистов C#
Ответить
Anonymous
 Есть ли способ быстрее просмотреть определенный индекс без использования массива?

Сообщение Anonymous »

Я создаю своего рода 2D-карту, к которой к каждой координате прикреплен класс tile,
Класс tile будет иметь внутри свою координату и некоторые другие значения, к которым можно будет получить доступ позже, но я хотел бы иметь эту карту без ограничений по размеру. Проблема в том, что я хочу видеть значения внутри некоторого тайла на этой карте, например: я нахожусь в координате (25,30) и хочу знать логическое значение внутри класса tile в каждом соседнем тайле.
  • И если я использую массив, у меня, возможно, будет самый быстрый способ проверить координату тайла, например массив из двух индексов. Я мог бы сделать каждый индекс координатой x и ay соответственно, поэтому я бы проверял эту координату только при просмотре значений на плитке. Но у карты будет ограничение по размеру.
  • И если я использую список, карта не будет иметь ограничения по размеру, но я не могу проверить координаты напрямую, поэтому мне нужно будет просмотреть каждую созданную плитку с помощью цикла foreach и проверить, совпадает ли координата внутри этой плитки с той, которую я ищу.
  • Мое текущее решение — иметь второй список только с координатами и назначать его при создании плитки, чтобы индекс в списке координат был таким же, как и в списке плиток. Поэтому, когда мне нужно проверить плитку, я выполняю координату.Contains(coordinate), и если это правда, то я помещаю индекс этой координаты в качестве индекса, который код должен искать в списке плиток.
Мне нужен более быстрый способ проверки плитки без ограничения размера.
Пока что tile List Я получал около 3200 мс каждый раз, когда проверял всю карту (около 2000 тайлов в списке).
А со списком mapCoord я получал около 1500 мс (около 2000 тайлов и координат).
И с массивом я получал довольно быстрый ответ (никогда не измерял его), но точно меньше секунды... Так как я никогда не пришлось проверять весь массив, но один для определенного индекса.
Примеры для облегчения понимания моей проблемы:
note1: он не заполняет весь массив.
note2: он не всегда будет прямоугольным.
int size = 50;
Tile[,] mapArray = new Tile[size,size];
List mapList = new List();
List mapCoord = new List();
void CreateMap()
{
for(int x = size/2; size 3)
{
mapArray[x,y] = new Tile(new Vector2Int(x,y), false, 32);
mapList.add(new Tile(new Vector2Int(x,y), false, 32));
mapCoord.add(new Vector2Int(x,y));
}
}
}
}

Итак, если бы мне нужно было проверить плитку в массиве, я бы просто проверил координату, поскольку координата плитки была бы такой же, как индекс массива, но имела бы ограничение по размеру.
И если бы я хотел проверить плитку в списке, мне нужно было бы выполнить цикл foreach, подобный этому. Довольно плохо с точки зрения производительности и оптимизации.
Tile desiredTile = null;
for each(Tile tile in mapTiles)
{
if(tile.Coord == DesiredCoord)
desiredTile = tile;
}

И лучший способ на данный момент — проверить список mapCoord следующим образом:
if(mapCoord.Contains(desiredCoord))
{
desiredTile = mapList[mapCoord.IndexOf(DesiredCoord)];
}
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»