2015-01-23 3 views
3

Я нахожу, что преобразовываю 1D байт и отдельные массивы в 2D, выполняя следующее. Я подозреваю, что это, вероятно, так же быстро, как и другие методы, но, возможно, есть более простая более простая парадигма? (Linq?)C# конвертировать 1D массив в 2D

private static byte[,] byte2D(byte[] input, int height, int width) 
    { 
     byte[,] output = new byte[height, width]; 
     for (int i = 0; i < height; i++) 
     { 
      for (int j = 0; j < width; j++) 
      { 
       output[i, j] = input[i * width + j]; 
      } 
     } 
     return output; 
    } 

    private static Single[,] single2D(byte[] input, int height, int width) 
    { 
     Single[,] output = new Single[height, width]; 
     for (int i = 0; i < height; i++) 
     { 
      for (int j = 0; j < width; j++) 
      { 
       output[i, j] = (Single)input[i * width + j]; 
      } 
     } 
     return output; 
    } 
+0

Вашего второго метода, является типом 'input' должен быть' байты [] ' ? – ryanyuyu

+0

Можете ли вы предоставить пример ввода/вывода для одной из этих функций? –

ответ

5

Это не помогает сделать код внутри методов чистого, но я заметил, что у вас есть 2 в основном идентичные методы, которые отличаются только в их типы. Я предлагаю использовать generics.

Это позволит вам определить свой метод только один раз. Используя ключевое слово where, вы можете даже ограничить типы типов, с которыми вы можете работать.

private static T[,] Make2DArray<T>(T[] input, int height, int width) 
{ 
    T[,] output = new T[height, width]; 
    for (int i = 0; i < height; i++) 
    { 
     for (int j = 0; j < width; j++) 
     { 
      output[i, j] = input[i * width + j]; 
     } 
    } 
    return output; 
} 

Вы назвали бы этот метод, как этот

int[] a; //or any other array. 
var twoDArray = Make2DArray(a, height, width); 
1

Generic функция:

private static b[,] to2D<a, b>(a source, valueAt: Func<a, int, b>, int height, int width) 
{ 
    var result = new b[height, width]; 
    for (int i = 0; i < height; i++) 
    { 
     for (int j = 0; j < width; j++) 
     { 
      result[i, j] = valueAt(source, i * width + j); 
     } 
    } 
    return result; 
} 

var bytes = to2D<byte[], byte>([], (bytes, at) => bytes[at], 10, 20); 
1

Buffer.BlockCopy(input, 0, output, 0, input.Length); быстрее, но быстро, чтобы не копировать массив на всех.

Если вам не нужен отдельный 2D-массив, вы можете просто получить доступ к вашему 1D-массиву, как 2D-массив, через функцию, свойство или настраиваемый тип. Например:

class D2<T> { 
    T[] input; 
    int lenght0; 
    public d2(T[] input, int lenght0) { 
     this.input = input; 
     this.lenght0 = lenght0; 
    } 
    public T this[int index0, int index1] { 
     get { return input[index0 * this.lenght0 + index1]; } 
     set { input[index0 * this.lenght0 + index1] = value; } 
    } 
} 

... 

byte[] input = { 1, 2, 3, 4 }; 
var output = new D2<byte>(input, 2); 
output[1, 1] = 0; // now input is { 1, 2, 3, 0 }; 

Кроме того, в отношении доступа к .NET многомерным массивам немного медленнее, чем доступ к зубчатым массивам

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