这个应该很简单,但我真的不知道如何找到办法......
我正在使用.NET 4.0。我有一个object[12]
填充十进制数字,并希望用它来填充Double
s [1,12]的Excel范围。我正在使用JavaScriptSerializer
转换JSON:
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]可能会更难)而且我不想为每一个案件而斗争。有没有办法把它写得更简单一些?
答案 0 :(得分:4)
为什么要使用动态?你为什么不创建一个代表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。
答案 1 :(得分:2)
您可以创建一个扩展方法,将一维数组(或任何其他集合)转换为包含一列的2D数组:
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;
你可以在一行上写这个,但我认为这会损害可读性。
答案 2 :(得分:0)
var values = ((object[]) jsonData["data"]).ConvertAll<double>();
sheet.Range["Input_PremiumSHR"].Value2 = new double[1, values.Length] { values };
但我同意Taesung explicit data structure would be better。