Свести объем трехмерного массива в одномерный массив объектов - PullRequest
4 голосов
/ 09 декабря 2011

Дайте, у меня есть 3D-карта типа, длина и ширина которой одинаковы, но глубина неровная:

public class Map<T>
{
    T[,][] map;
    ...
}

Каков наилучший способ вернуть одномерный массив всех объектов типакоторые существуют в объеме, определенном 2D-областью, и на всей глубине в этой области.Например, у меня может быть переопределение записи массива следующим образом:

public IEnumerable<T> this[Rectangle area]
{
    get {...}
}

или просто

public IEnumerable<T> this[int x, int y, int width, int length]
{
    get {...}
}

Я искренне надеюсь на быстрое решение LINQ, но производительность предпочтительнее, чем визуальная элегантностьрешение.Порядок объектов в возвращаемом плоском массиве не имеет значения.Если у кого-то есть какие-либо предложения или опыт в этом, пожалуйста, поделитесь своей мудростью.

В качестве альтернативы, если в моем распоряжении есть другая структура данных, которая может выполнять ту же функцию, о которой я не знаю, я с удовольствием воспользуюсь ею.1012 *

Если что-то по моему вопросу неясно, пожалуйста, попросите дополнительную информацию.

Ответы [ 2 ]

2 голосов
/ 09 декабря 2011

Вы ищете что-то подобное?

public IEnumerable<T> this[int left, int top, int width, int height]
{
    get
    {
        return from x in Enumerable.Range(left, width)
               from y in Enumerable.Range(top, height)
               from i in this.map[x, y]
               select i;
    }
}
1 голос
/ 09 декабря 2011

Это может также работать (без Linq)

    public IEnumerable<T> this[int x, int y, int width, int length]
    {
        get
        {
            for (int i = 0; i < length; i++)
            {
                for (int j = 0; j < width; j++)
                {
                    for (int k = 0; k < map[x + i, y + j].Length; k++)
                    {
                        yield return map[x + i, y + j][k];
                    }
                }
            }
        }
    }
...