2016-12-07 3 views
2

для одномерного массива обычно я бы использовал цикл for, как тот, который приведен ниже, но я не могу придумать, как это сделать, что не связано с множеством циклов.Замена всех элементов в многомерном массиве со случайными значениями

for (int i = 0; i < myArray.length; ++i) 
{ 
    myArray[i] = rnd.Next(1, 500); 
} 
+0

Вы говорите, что не знаете, сколько измерений имеет массив? – juharr

+0

Попробуйте следующее: http://stackoverflow.com/questions/359881/how-to-set-values-in-a-multidimensional-array-using-a-linear-index –

ответ

5

Вы можете попробовать низкий уровеньBuffer.BlockCopy скрыть цикл (ы):

// N-D array (whatever dimensions) 
    int[,,] array = new int[3, 5, 11]; 

    Buffer.BlockCopy(
    Enumerable 
     .Range(0, array.Length) 
     .Select(x => rand.Next(0, 500)) 
     .ToArray(), 
    0, 
    array, 
    0, 
    array.Length * sizeof(int)); // sizeof(int) : we copy bytes... 

мы создаем 1-D массив

Enumerable 
     .Range(0, array.Length) 
     .Select(x => rand.Next(0, 500)) 
     .ToArray() 

с общей длиной N-D одного (array.Length == array.Length(0) * ... * array.GetLEngth(N)) и скопировать его в N-D.

+1

Это не сработает, потому что он копирует результат 'Enumerable' и не управляет исходным массивом. Вы в основном манипулируете временным массивом и ничего не делаете с ним. –

+1

@Tamir Vered: Спасибо! Вы совершенно правы: я поставил подпрограмму преждевременно: неправильный порядок аргументов (исходный и целевой обмен) и неправильный размер * bytes * (должен был быть умножен на 'sizeof (int)') –

0

Использование более чем один цикл:

for (int i = 0; i < myArray.Length; ++i) 
{ 
    for (int j = 0; j < myArray[i].Length; ++j) 
    { 
     myArray[i][j] = rand.Next(0, 500); 
    } 
} 
+0

++ i vs i ++ не должно быть? –

+3

Он говорит: «Я не могу придумать способ сделать это, чтобы не было много циклов». –

+0

@asdf_enel_hak В этом использовании это не имеет значения, потому что возвращаемое значение приращения не используется. – juharr

Смежные вопросы