Как использовать массив двумерных массивов с плавающей запятой?

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

По сути, я хочу кэшировать 10 различных карт шума перлина, которые повторяются в игровом цикле. Каждая карта перлина представляет собой число с плавающей запятой [,]. Все карты имеют одинаковую ширину и высоту.

Я хочу сохранить их в некоторой структуре данных, которую я могу постоянно перебирать, будь то общий список или массив:

void BuildCache() {
    cache = new float[cacheSize][,];
    for(int i = 0; i < cacheSize; i++) {
        float[,] noiseMap = Noise.GenerateNoiseMap (width, height, seed, noiseScale, octaves, persistence, lacunarity, offset);
        cache [i] [0] = noiseMap;
        offset += speed;
    }
}

Это приводит к этой ошибке: Assets/Scripts/FogGenerator.cs(51,36): ошибка CS0022: неправильное количество индексов 1' inside [], expected2'

Это кажется базовой вещью, в Java я бы использовал общий список, но, поскольку я не могу сбросить общий список С#, я здесь в растерянности.


person swedish_fisk    schedule 06.06.2016    source источник
comment
cache[i] = noiseMap, удалить [0]   -  person Arturo Menchaca    schedule 06.06.2016
comment
Что вы имеете в виду, что не можете сбросить перечислитель для списка?   -  person juharr    schedule 06.06.2016
comment
Артуро, как тогда объявить кеш? Потому что я все еще получаю ошибки. Мое определение выглядит так: float[][,] cache;   -  person swedish_fisk    schedule 06.06.2016
comment
Я считал, что juharr List‹T› в System.Collections.Generic может быть повторен только с использованием перечислителя. У этого перечислителя нет реализации сброса, и я не мог создать новый перечислитель, так как он все еще начинался в конце списка?   -  person swedish_fisk    schedule 06.06.2016


Ответы (1)


В объявлении вашего массива вы явно указываете, что массив cache представляет собой массив многомерных массивов. Ошибка в кеше[i][0] = NoiseMap; потому что это похоже на синтаксис двумерного массива в языках на основе C/C++. Вы должны использовать cache[i] = NoiseMap, потому что тогда вы явно указываете компилятору, что вы ссылаетесь на двумерный массив в этом массиве и записываете в него какое-то значение.

person hubot    schedule 06.06.2016
comment
Имеет смысл, но как тогда определить фактический кеш? Вот как я это делал: float[][,] cache; Это создает: Assets/Scripts/FogGenerator.cs(51,25): ошибка CS0029: невозможно неявно преобразовать тип float[,]' to float[]' - person swedish_fisk; 06.06.2016
comment
Вы уверены, что используете имя_массива[индекс, индекс] вместо имя_массива[индекс][индекс]? Я сказал вам, что замените cache[i][0] = NoiseMap на cache[i] = NoiseMap. - person hubot; 06.06.2016
comment
Это прекрасно работает. Сравните его со своим кодом. static void BuildCache() { var cacheSize = 10; var cache = new float[cacheSize][,]; for (int i = 0; i ‹ cacheSize; i++) { float[,] NoiseMap = {{2.3f,4.5f},{2.3f,4.5f}}; кеш[i] = карта шума; } } - person shfire; 06.06.2016
comment
@shfire: я думал о том же - person hubot; 06.06.2016