簡體   English   中英

將Datatable列轉換為數組數組

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM