[英]Converting Datatable columns to array of array
有一個DataView tmp
,我需要從tmp
的兩列創建一個數組數組(可能這不是c#中的正確術語,我是新手)要傳遞給DotNet.Highcharts。 最終結構應類似於:
[[5, 2], [6, 3], [8, 2]]
首先,我使用以下代碼:
Object[] result = new object[tmp.Count];
result = tmp.Table
.AsEnumerable()
.Select(row => new Object[] { row.Field<DateTime>("DATE"),
Convert.ToDouble(row.Field<string>("VALUE"))})
.ToArray();
當我嘗試用Point
替換result
元素時(例如定義自定義標記),問題就來了:
if (something[k] == "TRUE") // if for a given row a generic condition is true
{
result[k] = new DotNet.Highcharts.Options.Point
{
X = Tools.GetTotalMilliseconds((DateTime)tmp[k].Row["DATE"]),
Y = Convert.ToInt32(tmp[k].Row["VALUE"]),
Marker = new PlotOptionsSeriesMarker
{
Symbol = "url(/Proj/images/cross.png)"
}
};
}
在運行時,我得到: A first chance exception of type 'System.ArrayTypeMismatchException' occurred in App_Web_pz3kxbru.dll
我找到了解決辦法,以創建result
:
Object[] result = new object[tmp.Count];
for (int j = 0; j < tmp.Count; j++)
{
result [j] = new object[] { (DateTime)tmp[j].Row["DATE"],
Convert.ToDouble(tmp[j].Row["VALUE"])};
}
現在一切正常。 但是,我對我實際上所做的事情一無所知……能否請您解釋一下我用來獲得result
的方法之間的區別。
我可以注意到的唯一區別是第一種方法的 Convert.ToDouble
:
.Select(row => new Object[] { row.Field<DateTime>("DATE"),
Convert.ToDouble(row.Field<string>("VALUE"))})
與第二個中的 Convert.ToInt32
:
new object[] { (DateTime)tmp[j].Row["DATE"],
Convert.ToInt32(tmp[j].Row["VALUE"])};
更新:
第一種方法創建一個新數組,將原來的對象數組( Object[]
)替換為新數組,即'array of array'( Object[][]
),從而導致問題( 協變量數組問題) )。
第二種方法不是創建新的數組,而是用數組填充對象的原始數組中的每個插槽。 因此,在這種情況下, result
仍然是對象數組,不會更改為“數組數組”,因此可以避免異常。
如果您喜歡LINQ方法,則可以這樣做(仍然需要一個計數器變量):
Object[] result = new object[tmp.Count];
int i = 0;
result = tmp.Table
.AsEnumerable()
.ForEach(row => result[i++] = new Object[] { row.Field<DateTime>("DATE"),
Convert.ToDouble(row.Field<string>("VALUE"))});
或更妙的是,只需將對象數組轉換為對象:
result = tmp.Table
.AsEnumerable()
.Select(row => (Object)new Object[] { row.Field<DateTime>("DATE"),
Convert.ToDouble(row.Field<string>("VALUE"))})
.ToArray();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.