2

这个应该很简单,但我真的不知道如何找到一种方法来做到这一点......

我正在使用 .NET 4.0。我有一个object[12]填充十进制数字,并想用它来填充Doubles [1,12] 的 Excel 范围。我正在使用以下方式转换 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] 的案例可能会更难),我不想为每个案例做太多的挣扎。有没有办法写得更简单一点?

4

3 回答 3

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。

于 2011-08-01T22:44:29.573 回答
2

您可以创建一个扩展方法,将一维数组(或任何其他集合)转换为具有一列的二维数组:

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;

可以将其写在一行上,但我认为这会损害可读性。

于 2011-08-01T23:08:07.900 回答
0
var values = ((object[]) jsonData["data"]).ConvertAll<double>();
sheet.Range["Input_PremiumSHR"].Value2 = new double[1, values.Length] { values };

但我同意 Taesung 的观点,即明确的数据结构会更好

于 2011-08-01T22:50:32.900 回答