C# C语言中对象到二维数组的转换#

C# C语言中对象到二维数组的转换#,c#,.net,json,excel-interop,C#,.net,Json,Excel Interop,这一个应该很简单,但我真的不知道如何找到一种方法来做到这一点 我正在使用.NET4.0。我有一个用十进制数字填充的对象[12],我想用它填充一个Excel范围的Doubles[1,12]。我正在使用JavaScriptSerializer转换JSON: JavaScriptSerializer javascriptSerializer = new JavaScriptSerializer(); var jsonData = javascriptSerializer.Deserialize<

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

我正在使用.NET4.0。我有一个用十进制数字填充的
对象[12]
,我想用它填充一个Excel范围的
Double
s[1,12]。我正在使用
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]}");
我希望这样的事情能奏效,但据我所知,初始化者不会这样做:

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

我有很多类似的案例(一个是[12,1],这可能会更难),我不想为每一个都挣扎太多。有没有更简单一点的方法呢?

为什么要使用dynamic?为什么不创建一个简单的类来表示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]}");
JavaScriptSerializer JavaScriptSerializer=new JavaScriptSerializer();
var jsonData=javascriptSerializer.Deserialize({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

var values=((object[])jsonData[“data”]).ConvertAll();
var values = ((object[]) jsonData["data"]).ConvertAll<double>();
sheet.Range["Input_PremiumSHR"].Value2 = new double[1, values.Length] { values };
sheet.Range[“Input_PremiumSHR”].Value2=新的双精度[1,values.Length]{values};

但我同意Taesung的观点。

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

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;
}
static T[,]到列(此IEnumerable序列)
{
var items=sequence.ToArray();
var列=新的T[1,items.Length];
对于(int i=0;i
使用它,您可以编写如下代码:

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

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

sheet.Range["myExcelRangeName"].Value2 = column;
var data=(object[])jsonData[“data”];
var column=data.Cast().Select(x=>(double)x.ToColumn();
sheet.Range[“myExcelRangeName”]。值2=列;

你可以把它写在一行上,但我认为这会影响可读性。

jsonData的实际类型是什么(正如
GetType().FullName
所说的)?jsonData[“data”]是System.Object[],但jsonData本身是System.Collections.Generic.Dictionary`2类型[[System.String,mscorlib,Version=4.0.0.0,Culture=neutral,PublicKeyToken=b77a5c561934e089],[System.Object,mscorlib,Version=4.0.0.0,Culture=neutral,PublicKeyToken=b77a5c561934e089]]您的代码不起作用。
ConvertAll()
需要两个类型参数,并且您不能按您的方式初始化数组。这会给我什么“需要嵌套数组初始值设定项”也是吗?我想对我来说也是。无论如何,我可能会尝试显式数据结构。非常感谢,它看起来是一个可接受的解决方案。如果我能够将它与将json转换为显式结构结合起来,它将是
sheet.Range[“myExcelRangeName”]。Value2=ToColumn(jsonData.data);
我也对这个答案投了赞成票,因为这是事实,在这里使用dynamic没有任何意义,它的可读性要差得多,json应该有一些预期的结构。我可能会使用它。
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;