преобразование объекта в двумерный массив в C # - PullRequest
2 голосов
/ 02 августа 2011

Это должно быть просто, но я не знаю, как найти способ сделать это ...

Я использую .NET 4.0. У меня есть object[12], заполненное десятичными числами, и я хочу использовать его для заполнения диапазона Excel Double с [1,12]. Я конвертирую JSON используя JavaScriptSerializer:

JavaScriptSerializer javascriptSerializer = new JavaScriptSerializer();
var jsonData = javascriptSerializer.Deserialize<dynamic>("{data:[0.11, 0.12, 0.13, 0.14, 0.15, 0.16, 0.17, 0.18, 0.19, 0.2, 0.21, 0.22]}");

Это должен быть однострочник, но единственное, что я могу придумать, это:

var myArray = new Double[1, 12];
// the cast to Double is necessary as json data is of type decimal, however excel seems to only accepts Double here
for (int i = 0; i < 12; i++) { PrimeShr[0,i] = (Double) jsonData["data"][i]; };
// sheet is of type Microsoft.Office.Interop.Excel.Worksheet
sheet.Range["myExcelRangeName"].Value2 = myArray;

или все еще довольно жалкий, но хотя бы в одной строке:

sheet.Range["Input_PremiumSHR"].Value2 = new Double[1, 12] { { (Double)jsonData["data"][0], (Double)jsonData["data"][1], (Double)jsonData["data"][2], (Double)jsonData["data"][3], (Double)jsonData["data"][4], (Double)jsonData["data"][5], (Double)jsonData["data"][6], (Double)jsonData["data"][7], (Double)jsonData["data"][8], (Double)jsonData["data"][9], (Double)jsonData["data"][10], (Double)jsonData["data"][11] } };

Я ожидаю, что что-то подобное сработает, но из того, что я собираю, инициализаторы не будут работать таким образом:

sheet.Range["Input_PremiumSHR"].Value2 = new Double[1, 12] { new System.Collections.ArrayList( jsonData["data"] ).ToArray() };

У меня довольно много подобных случаев (один с [12,1], который, вероятно, может быть сложнее), и я не хочу так сильно бороться с каждым. Есть ли способ написать это немного проще?

Ответы [ 3 ]

4 голосов
/ 02 августа 2011

Почему вы должны использовать динамический? Почему бы вам не создать простой класс, представляющий jsonData.

 public class SomeData
 {
      public double[] data { get; set; }
 }

Затем после десериализации,

 JavaScriptSerializer javascriptSerializer = new JavaScriptSerializer();
 var jsonData = javascriptSerializer.Deserialize<SomeData>("{data:[0.11, 0.12, 0.13, 0.14, 0.15, 0.16, 0.17, 0.18, 0.19, 0.2, 0.21, 0.22]}");

вы сможете получить прямой доступ к jsonData.data.

2 голосов
/ 02 августа 2011

Вы можете создать метод расширения, который превращает одномерный массив (или любую другую коллекцию) в двумерный массив с одним столбцом:

static T[,] ToColumn<T>(this IEnumerable<T> sequence)
{
    var items = sequence.ToArray();

    var column = new T[1, items.Length];

    for (int i = 0; i < items.Length; i++)
        column[0, i] = items[i];

    return column;
}

Используя это, вы можете написать код следующим образом:

var data = (object[])jsonData["data"];

var column = data.Cast<decimal>().Select(x => (double)x).ToColumn();

sheet.Range["myExcelRangeName"].Value2 = column;

Вы могли бы написать это в одной строке, но я думаю, что это ухудшило бы читабельность.

0 голосов
/ 02 августа 2011
var values = ((object[]) jsonData["data"]).ConvertAll<double>();
sheet.Range["Input_PremiumSHR"].Value2 = new double[1, values.Length] { values };

Но я согласен с Taesung, что явная структура данных будет лучше .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...