2

これは単純なはずですが、それを行う方法を見つける方法が本当にわかりません...

.NET4.0を使用しています。object[12]10進数を入力しましたが、これを使用してExcelの範囲Doubles[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;

またはそれでもかなり哀れですが、少なくとも1行で:

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

1次元配列(またはその他のコレクション)を1つの列を持つ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;

一行で書けますが、読みやすさが悪くなると思います

于 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 };

しかし、明示的なデータ構造の方が良いというテソンに同意します。

于 2011-08-01T22:50:32.900 に答える