2014-11-08 4 views
-1

Допустим, у нас есть 2 массива:Сведение массив из 2d-1d

double[,] a = new double[width,height]; 
double[] b = new double[width*height]; 

Мы заполнить с некоторыми числами, скажем 0s и 1s.

Почему:

for(int i = 0; i < a.GetLength(0); i++) 
    for(int j = 0; j < a.GetLength(1); j++) 
     b[i * a.GetLength(0) + j] = a[i,j]; 

возвращение только 0s во всех областях Ь []?

+0

Мм, внутр Array.GetLenght (интермедиат size) Получает 32-битное целое число, которое представляет количество элементов в указанном измерении System.Array, я думал, что он стандартный в VS2013. Также да, я запускаю отладчик, он корректно перебирает массив, отображая правильные значения на часах, но по какой-то причине он не передает их в массив b. – Januszoff

+0

Итак, вы не заметили свою собственную опечатку 'Array.GetLenght', поэтому я спросил, был ли это собственный пользовательский метод. Это должно быть' Array.GetLength' – MethodMan

ответ

0

Вам нужно умножить на длину второго измерения, не первый:

b[i * a.GetLength(1) + j] = a[i,j]; 

Кроме того, есть менее эффективны, но труднее испортить способов сделать это:

b = a.Cast<double>.ToArray(); 
+0

В моем случае массив равен 16x16, поэтому shouldn «Действительно ли это имеет значение, по которому я умножаю – Januszoff

+3

Просто убедитесь, что вы (1) уверены, что' a' не все 0 и 2) уверены, что этот код работает и соответствует коду в вопросе? –

+0

@ChrisPitman вы не должны были отвечать на вопрос в первую очередь, если вы не знаете, что на самом деле делает OP в своем коде. -1 – mihai

0

Добавьте следующую строку:

Debug.WriteLine("b[" + (i* a.GetLenth(1) + j) + "] = " + b[i * a.GetLength(1) + j]); 

и проверить, что происходит

2

Кстати. Гораздо более эффективный способ для преобразования 2-D массив в 1-й массив является:

public static T[] ToPlainArray<T>(this T[,] array) 
{ 
    Type type = typeof(T); 
    int sizeInBytes = Marshal.SizeOf(type); 
    T[] buffer = new T[array.Length]; 
    Buffer.BlockCopy(array, 0, buffer, 0, array.Length * sizeInBytes); 
    return buffer; 
} 

Использование:

double[] b = a.ToPlainArray(); 

Или

double[] b = ToPlainArray(a); 
+0

Начиная с .NET 4.5.1 (с 2013 года, включенного в Visual Studio 2013), вы можете использовать ['Marshal.SizeOf ()'] (http://msdn.microsoft.com/en-us/library/dn261466.aspx), который является более элегантным. –

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