2009-07-25 2 views

ответ

2

Я просто написал этот код, который я буду использовать:

using System.Collections.Generic; 
using System.Collections.ObjectModel; 
using System.Linq; 

namespace MiscellaneousUtilities 
{ 
    public static class Enumerable 
    { 
     public static T[,] ToRow<T>(this IEnumerable<T> target) 
     { 
      var array = target.ToArray(); 
      var output = new T[1, array.Length]; 
      foreach (var i in System.Linq.Enumerable.Range(0, array.Length)) 
      { 
       output[0, i] = array[i]; 
      } 
      return output; 
     } 

     public static T[,] ToColumn<T>(this IEnumerable<T> target) 
     { 
      var array = target.ToArray(); 
      var output = new T[array.Length, 1]; 
      foreach (var i in System.Linq.Enumerable.Range(0, array.Length)) 
      { 
       output[i, 0] = array[i]; 
      } 
      return output; 
     } 
    } 
} 
+0

@alexw Хороший улов. Я собираюсь удалить свой предыдущий комментарий. – shoelzer

8

Там нет прямого пути. Вы должны скопировать материал в double[,]. Предполагая, что вы хотите в одной строке:

double[,] arr = new double[1, original.Length]; 
for (int i = 0; i < original.Length; ++i) 
    arr[0, i] = original[i]; 
+0

@alexw Хороший улов. Я собираюсь удалить свой предыдущий комментарий. – shoelzer

0

Mehrdad предполагает, что ширина один, так как нет никакого реального способа определить ширину или высоту от одномерного массива сам по себе. Если у вас есть (вне) понятие «ширины», то код Мердад становится:

// assuming you have a variable with the 'width', pulled out of a rabbit's hat 
int height = original.Length/width; 
double[,] arr = new double[width, height]; 
int x = 0; 
int y = 0; 
for (int i = 0; i < original.Length; ++i) 
{ 
    arr[x, y] = original[i]; 
    x++; 
    if (x == width) 
    { 
     x = 0; 
     y++; 
    } 
} 

Хотя ряд основных, вероятно, более широко распространена во многих приложениях (матрицы, текстовые буферы или графики):

// assuming you have a variable with the 'width', pulled out of a rabbit's hat 
int height = original.Length/width; 
double[,] arr = new double[height, width]; // note the swap 
int x = 0; 
int y = 0; 
for (int i = 0; i < original.Length; ++i) 
{ 
    arr[y, x] = original[i]; // note the swap 
    x++; 
    if (x == width) 
    { 
     x = 0; 
     y++; 
    } 
} 
4

Если вы знаете ширину 2D массива вы можете использовать следующие поставить Валу как одна строка за другой.

private T[,] toRectangular<T>(T[] flatArray, int width) 
    { 
     int height = (int)Math.Ceiling(flatArray.Length/(double)width); 
     T[,] result = new T[height, width]; 
     int rowIndex, colIndex; 

     for (int index = 0; index < flatArray.Length; index++) 
     { 
      rowIndex = index/width; 
      colIndex = index % width; 
      result[rowIndex, colIndex] = flatArray[index]; 
     } 
     return result; 
    } 
+1

Хотя очень легко следовать, это (относительно) вычислительно дорого. – cjbarth

+0

Jon Skeet опубликовал метод, ориентированный на производительность, на http://stackoverflow.com/questions/5132397/fast-way-to-convert-a-two-dimensional-array-to-a-list-one-dimensional – ShawnFeatherly

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