Я использую C #, и я использовал 2d массив структур для сетки плиток. Это не о том, как найти 8 соседних плиток из плитки в сетке. Я понимаю, что в C # вы можете получить серию возвратов доходности, чтобы сделать ienumerable. Например:
public IEnumerable<int> fakeList()
{
yield return 1;
yield return 2;
}
И вызовите его с помощью цикла foreach. Теперь в моем классе сетки хочу иметь простой способ получить доступ к соседям в grid.array [x, y] и изменить его. Но так как это структура, я не могу написать итератор, например:
public IEnumerable<int> neighbours(int x, int y)
{
if((x+1) >=0 && y >=0 && .....)//check if node above is inside grid
yield return grid.array[x+1,y];
//rinse and repeat 7 more times for each direction
}
Вместо этого, каждый раз, когда мне нужны соседи, мне нужно скопировать, вставить условия 8if и проверить, что я используюправильное направление x +, направление y +, чтобы найти действительные индексы. По сути, огромная боль.
Я мог бы обойтись:
- Не используя структуры и облегчая мою жизнь. И избавиться от возможной преждевременной оптимизации. НО я собираюсь запускать этот код каждый кадр в моей игре. Возможно, несколько раз. Поэтому я хотел бы сохранить структуры, если это возможно.
- Вместо этого напишите итератор для индексов. Пример:
Допустим ли второй подход? Или это генерирует мусор? Я не знаю, как доходность работает в деталях.
public struct GridTile
{
public int x;
public int z;
public GridTile(int x, int z)
{
this.x = x;
this.z = z;
}
}
public IEnumerable<int> neighbours(int x, int y)
{
if ((x + 1) >= 0 && y >= 0 && .....)//check if right node is inside
yield return new Gridtile(x + 1, y);
//rinse and repeat 7 more times for each direction
}